选择矩阵元素(矩阵语言)

问题描述:

我想选择矩阵或向量的特定元素,可以说大于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. 

如果你有你想要的指数,你可以简单地提供这些在一个单独的子集向量。

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. 

这应该是相当快的。大部分时间将用于条件语句并提取数据。即使对于大量的行或列,排名索引也应该很小。