SAS Proc IML: выполнение цикла для заполнения матрицы

У меня есть следующий код, который отлично работает в MATLAB, и я транспонирую его в SAS/PROC IML:

[row col] = size(coeff);

A_temp    = zeros(row,col);
for i = 1: row/6            
    A_temp(6*(i-1)+1:6*i,:) = coeff(6*(i-1)+1:6*i,4:col);end;

В Proc IML я делаю следующее:

proc iml;
  use i.coeff;
  read all var {...} into coeff;
  print coeff;

row=NROW(coeff);
print row;
col=NCOL(coeff);
print col;
A_temp=J(row,col,0); *create zero matrix;
print A_temp;

Do i=1 TO row/6;
A_temp[(6*(i-1)+1):(6*i),]=coeff[(6*(i-1)+1):(6*i),(4:col)];
END;
quit;

Код ломается в цикле DO "(выполнение) Матрицы не соответствуют операции. "...почему? Если я правильно понимаю в PROC IML, если я хочу выбрать весь столбец (в MATLAB это будет ":"), но в SAS IML я просто оставлю его пустым


person Plug4    schedule 20.03.2013    source источник
comment
Что именно вы пытаетесь сделать в конце? Похоже, вы пытаетесь назначить матрицу [6 строк, 4: столбец] матрице [6 строк, 1: столбец]. Как именно это будет работать — что произойдет с остальными тремя столбцами матрицы A_temp?   -  person Joe    schedule 20.03.2013
comment
мой A_temp представляет собой матрицу 30X30 с нулями перед циклом. Затем я выбираю из матрицы COEFF 6 строк и 26 столбцов, чтобы поместить их в матрицу A_temp... если она работает в MATLAB... насколько это может отличаться в IML? Спасибо   -  person Plug4    schedule 20.03.2013
comment
Я имею в виду, что вы помещаете матрицу 6x27 (4:30 = 27) и помещаете ее в матрицу 6x30 (определенное подмножество A_temp). Что SAS там должен делать? Очевидно, что Matlab просто помещает его в первые 27, но как SAS должен знать, что это то, что вам нужно (в отличие от последних 27 или чего-то еще)?   -  person Joe    schedule 20.03.2013


Ответы (1)


Вы должны указать его правильно. A[rows,] означает ВСЕ столбцы A, а не любое их количество. См. этот упрощенный пример:

proc iml;
/*  use i.coeff;
  read all var {...} into coeff;
  print coeff;
*/
coeff = J(15,10,3);
row=NROW(coeff);
print row;
col=NCOL(coeff);
print col;
A_temp=J(row,col,0); *create zero matrix;
print A_temp;

Do i=1 TO row;
* does not work; *A_temp[i,]=coeff[i,(4:col)];
A_temp[i,1:col-3]=coeff[i,(4:col)];
END;
quit;
person Joe    schedule 20.03.2013