Matlab:从每列中获取无零点的随机值

时间:2013-02-27 18:52:35

标签: matlab random vector matrix zero

我有一个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]

由于

3 个答案:

答案 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);