Выбор элементов матрицы (язык матрицы) - PullRequest
1 голос
/ 24 февраля 2012

Я хотел бы выбрать конкретные элементы матрицы или вектора, скажем, больше 0. Один из вариантов - циклически проходить через каждый элемент моей матрицы / вектора, но мне интересно, есть ли лучший способ добиться этого (как вR, с каким условием).Мой код выглядит так:

matrix.
compute A={1,2,5,6,1,6,0,4,0,3,6,0,2,-3}.
compute b=0.

loop #i=1 to ncol(A).
    do if ( A(1,#i) >0 ).
        compute b={b,a(1,#i)}.
    end if.
end loop.

compute b=b(1,2:ncol(b)).
print b.

end matrix.

1 Ответ

0 голосов
/ 17 июля 2014

Если у вас есть нужные вам индексы, вы можете просто указать их в отдельном векторе подмножеств.

matrix.
compute A={1,2,5,6,1,6,0,4,0,3,6,0,2,-3}.
compute take = {1,2,4}.
print A(take).
end matrix.

, который выдает 1 2 6 в операторе печати.Теперь захват индексов немного раздражает.Одним из способов является использование GRADE для отрицания условия встречи, которое обеспечивает порядок для получения нужных вам индексов.Затем выберите только общее количество индексов, которые, как вы знаете, удовлетворяют условию.

matrix.
compute A={1,2,5,6,1,6,0,4,0,3,6,0,2,-3}.

*make sequential index and vector with selection.
compute take = {1:NCOL(A)}.
compute sel = A > 0.

*reording the indices so the selected columns are first.
compute take(GRADE(-1*sel)) = take.

*only taking the indices that meet the selection.
compute take = take(1:RSUM(sel)).

*results.
print A.
print A(take).
end matrix.

Это можно свернуть в макрос, чтобы облегчить эту задачу.Вот пример, который будет работать здесь.

DEFINE !SelCol (Data = !TOKENS(1)
               /Condition = !TOKENS(1) 
               /Result = !TOKENS(1) )
COMPUTE XKeepX = !UNQUOTE(!Condition).
COMPUTE XIndX = {1:NCOL(!Data)}.
COMPUTE XIndX(GRADE(XKeepX*-1)) = XIndX.
COMPUTE XIndX = XIndX(1:RSUM(XKeepX)).
COMPUTE !Result = !Data(1:NROW(!Data),XIndX).
RELEASE XKeepX.
RELEASE XIndX.
!ENDDEFINE.

MATRIX.
COMPUTE A={1,2,5,6,1,6,0,4,0,3,6,0,2,-3}.
!SelCol Data=A Condition='A>0' Result=ASel.
PRINT ASel.
END MATRIX.

Этот подход также легко адаптируется к выбору определенных строк матрицы.

DEFINE !SelRow (Data = !TOKENS(1)
               /Condition = !TOKENS(1)
               /Result = !TOKENS(1) )
COMPUTE XKeepX = !UNQUOTE(!Condition).
COMPUTE XIndX = {1:NROW(!Data)}.
COMPUTE XIndX(GRADE(XKeepX*-1)) = XIndX.
COMPUTE XIndX = XIndX(1:CSUM(XKeepX)).
COMPUTE !Result = !Data(XIndX,1:NCOL(!Data)).
RELEASE XKeepX.
RELEASE XIndX.
!ENDDEFINE.

Это должно быть довольно быстро.Большая часть времени будет потрачена на условный оператор и извлечение данных.Ранжирование индекса должно быть довольно тривиальным даже для действительно большого количества строк или столбцов.

...