3

次のような2次元行列があります。

possibleDirections =

 1     1     1     1     0
 0     0     2     2     0
 3     3     0     0     0
 0     4     0     4     4
 5     5     5     5     5

ゼロ以外の値から乱数をベクトルに取得するには、すべての列から必要です。値 5 は常に存在するため、すべてゼロの列はありません。ベクトルの操作を使用してこれを達成する方法はありますか (各列を個別に処理する必要はありません)。結果の例は [1 1 1 1 5] です。

ありがとう

4

3 に答える 3

2

代替ソリューション:

[r,c] = size(possibleDirections);

[notUsed, idx] = max(rand(r, c).*(possibleDirections>0), [], 1);

val = possibleDirections(idx+(0:c-1)*r);

問題の例のように、行列の要素possibleDirectionsが常にゼロか、それぞれの行番号に等しい場合、最後の行は必要ありません。解は既にidx.

そして(かなり面白い)ワンライナー:

result = imag(max(1e05+rand(size(possibleDirections)).*(possibleDirections>0) + 1i*possibleDirections, [], 1));

ただし、このワンライナーは、 の値possibleDirectionsが よりもはるかに小さい場合にのみ機能することに注意してください1e5

于 2013-02-27T20:56:31.323 に答える
2

直接または arrayfun を介してループせずにこれを行うことができます。

[rowCount,colCount] = size(possibleDirections);
nonZeroCount = sum(possibleDirections ~= 0);
index = round(rand(1,colCount) .* nonZeroCount +0.5);
[nonZeroIndices,~] = find(possibleDirections);
index(2:end) = index(2:end) + cumsum(nonZeroCount(1:end-1));
result = possibleDirections(nonZeroIndices(index)+(0:rowCount:(rowCount*colCount-1))');
于 2013-02-27T20:12:46.217 に答える
1

このコードを 2 つのarrayfun呼び出しで試してください。

nc = size(possibleDirections,2); %# number of columns
idx = possibleDirections ~=0;    %# non-zero values
%# indices of non-zero values for each column (cell array)
tmp = arrayfun(@(x)find(idx(:,x)),1:nc,'UniformOutput',0); 
s = sum(idx); %# number of non-zeros in each column
%# for each column get random index and extract the value
result = arrayfun(@(x) tmp{x}(randi(s(x),1)), 1:nc); 
于 2013-02-27T19:35:22.090 に答える