2017-08-05 101 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