मान लीजिए $n>0$ एक पूर्णांक है, और $r_1$ को लंबाई $n$, $r_1 = r_{1,1},r_{1,2},\dots,r_{1,n} का वेक्टर बनने दें। $.

मैं $1

एसएएस में यह कैसे करें? मान लें कि $n$ को मैक्रो वैरिएबल के रूप में परिभाषित किया गया है। मुझे यकीन नहीं है कि प्रारंभिक वेक्टर $r_1$ कैसे दर्ज किया जाए, लेकिन मान लें कि हमारे पास वह है। पुनरावर्ती भाग के लिए मैं पंक्तियों के साथ सोच रहा था:

array r{&n,&n};

do j=1 to &n;
  r{1,j} = r_1{j};
end;

do i=2 to &n;
  do j=i to &n;
  r{i,j} = r{i-1,j}/(1-r{i-1,i-1});
end;

क्या मैं सही रास्ते पर हूं?

0
drdiem 2 अगस्त 2019, 01:01

1 उत्तर

सबसे बढ़िया उत्तर

सुनिश्चित नहीं है कि इनपुट डेटा कहां से आ रहा है। लेकिन यह मानते हुए कि आपके पास उन्हें नाम देने के लिए लचीलापन है जिस तरह से मैंने निम्नलिखित की कोशिश की:

/* Creating this to have some data to work with. */
/* You may probably populate r1_ elements on the fly within your dataset */

%let n = 5;

data have (keep = r1_:);

  /* This defines r1_1, r1_2 etc. and groups them into array*/
  array r1 {&n} r1_1 - r1_&n;

  /* Generating 5 records to play with */
  do cnt = 1 to 5;
    do ii = 1 to &n;
      r1{ii} = round(ranuni(23423)*10,1);
    end;
    output;
  end;
run;

%let total = %eval(&n * &n);

data want;
  set have;

  /* You need to regroup the r1 elements into an array */
  /* Otherwise SAS will not know how to perform array operation on those group of variables */
  array r1 {&n} r1_1 - r1_&n;

  /* Then you have the 2D array */
  array R {&n,&n} R_1 - R_&total;

  do j = 1 to &n;
    R{1,j} = r1{j};
  end;

  do i = 2 to &n;
    do j = i to &n;
      R{i,j} = R{i-1,j}/(1-R{i-1,i-1});
    end;
  end;
run;

R1 - R&total का होना भ्रमित करने वाला हो सकता है जब आप उन मानों को देख रहे हों क्योंकि सबस्क्रिप्ट खो गए हैं। अधिक पठनीयता के लिए आप घटकों के नामकरण के इस तरीके को आजमा सकते हैं:

%macro want;

data want;
  set have;

  /* You need to regroup the r1 elements into an array */
  /* Otherwise SAS will not know how to perform array operation on those group of variables */
  array r1 {&n} r1_1 - r1_&n;

  /* Then you have the 2D array */
  /* The loop just generates components to be named R11 to R15, R21 to R25 etc. instead of just R1 to R25 */
  array R {&n,&n} 
  %do ii = 1 %to &n;
      R_&ii.1 - R_&ii.&n
  %end;
  ;

  do j = 1 to &n;
    R{1,j} = r1{j};
  end;

  do i = 2 to &n;
    do j = i to &n;
      R{i,j} = R{i-1,j}/(1-R{i-1,i-1});
    end;
  end;
run;

%mend;

%want;

आप इस तरह के काम के लिए PROC IML का भी पता लगा सकते हैं क्योंकि यह आपको अपने मैट्रिक्स संचालन में अधिक लचीलापन देगा।

0
SAS2Python 2 अगस्त 2019, 21:52