2017-08-05 119 views
1

我有一个垂直的Nx1矩阵满了整数。MATLAB根据矢量生成具有逻辑值的矩阵

A: 
+---+ 
| 4 | 
| 3 | 
| 1 | 
| . | 
+---+ 

我的目标是创建一个N×M个矩阵B,其中每个单元的值是1,如果是行是小于或等于A中的相应的编号,其余为0。

B: 
+-------------+ 
| 1 1 1 1 0 . | 
| 1 1 1 0 0 . | 
| 1 0 0 0 0 . | 
| . . . . . . | 
+-------------+ 

这可以通过逐行迭代来实现,但我试图找到更快的方法。我觉得这可以通过逻辑索引来完成,但不能想到如何完全摆脱我的头脑。

回答

2

可以键入:

B = A>=1:size(A,1) 
% or, in versions earlier than 2016b: 
B = bsxfun(@ge,A,1:size(A,1)) 

这将在compare each valueA所有数字1之间的长度A,如果它大于或等于(@ge ...),则返回1;否则返回0。结果是矩阵,其中每行k是值A(k)的比较,所有值在1A的长度之间。

+0

这似乎不适用于我。大小(A,1)将给出N,A矢量的高度。 1:大小(A,1)将给出水平向量1,2,... N。当我执行A> = 1:size(A,1)时,表示Matrix维度的MATLAB错误必须一致。我明白你想通过比较一个垂直矢量和一个水平矢量来得到矩阵,但是这个语法看起来不起作用。 –

+1

没关系,只是看到你的编辑。 –

1

找到了我的问题的解决方案。

index = repmat(1:max(A),length(A),1); 
    B = ones(length(A),max(A)); 
    B(index>repmat(A,1,max(A))) = 0; 

索引是一个N×M矩阵,其中一个单元格的值等于它的列号。每当值比A的值越大,在B中的相应的单元被设置为0