我有一个2d矩阵如下:
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]
由于
答案 0 :(得分: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))');
答案 1 :(得分:2)
替代解决方案:
[r,c] = size(possibleDirections);
[notUsed, idx] = max(rand(r, c).*(possibleDirections>0), [], 1);
val = possibleDirections(idx+(0:c-1)*r);
如果矩阵possibleDirections
中的元素总是零或等于相应的行号,如问题中给出的示例,则最后一行不是必需的,因为解决方案已经是{{1} }。
一个(相当有趣的)单行:
idx
但请注意,只有result = imag(max(1e05+rand(size(possibleDirections)).*(possibleDirections>0) + 1i*possibleDirections, [], 1));
中的值远小于possibleDirections
时,此单行才有效。
答案 2 :(得分:1)
通过两次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);