创建一个矩阵,其中的顺序值用零填充(没有循环)

时间:2012-11-01 16:05:06

标签: matlab

我有两个矩阵ab的1列和 n 行。

这些矩阵代表最小值和最大值。

从这些我需要通过 m 矩阵创建 n m [a ; b]

的最大值

结果必须包含a(:)b(:)之间的每个值,并用零填充。

注意:使用for循环很容易,但我想避免循环。

例如:

从这两个矩阵开始:

>> a = [3 ; 5 ; 2 ; 7 ; 4]

a =

     3
     5
     2
     7
     4

>> b = [7 ; 7 ; 5 ; 8 ; 4]

b =

     5
     7
     4
     8
     4

我想以这个矩阵结束:

result =

     3     4     5     6     7     0     0     0
     5     6     7     0     0     0     0     0
     2     3     4     5     0     0     0     0
     7     8     0     0     0     0     0     0
     4     0     0     0     0     0     0     0

到目前为止,我有这个:

>> result = zeros(size(a,1), max([a ; b]));
>> rows = [1:size(a,1)]

rows =

     1     2     3     4     5

>> index = sub2ind(size(result), rows, b - a + 1)
>> result(index) = b

result =

     0     0     0     0     7     0     0     0
     0     0     7     0     0     0     0     0
     0     0     0     5     0     0     0     0
     0     8     0     0     0     0     0     0
     4     0     0     0     0     0     0     0

>> result(:,1) = a

result =

     3     0     0     0     7     0     0     0
     5     0     7     0     0     0     0     0
     2     0     0     5     0     0     0     0
     7     8     0     0     0     0     0     0
     4     0     0     0     0     0     0     0

2 个答案:

答案 0 :(得分:3)

我用一个简单的循环来解决这个问题,这也可能是最快的解决方案

a = [3 ; 5 ; 2 ; 7 ; 4]
b = [7 ; 7 ; 5 ; 8 ; 4]
nSteps = b-a+1;
nRows = size(a,1);

result = zeros(nRows, max([a ; b]));

for iRow = 1:nRows
   result(iRow,1:nSteps(iRow)) = a(iRow):b(iRow);
end

result =

 3     4     5     6     7     0     0     0
 5     6     7     0     0     0     0     0
 2     3     4     5     0     0     0     0
 7     8     0     0     0     0     0     0
 4     0     0     0     0     0     0     0

如果您不需要可读性,这里是一个非循环解决方案:

result = ones(nRows, max([a ; b]));
result(:,1) = a;
result = cumsum(result,2);
result(bsxfun(@gt,result,b))=0

result =

     3     4     5     6     7     0     0     0
     5     6     7     0     0     0     0     0
     2     3     4     5     0     0     0     0
     7     8     0     0     0     0     0     0
     4     0     0     0     0     0     0     0

答案 1 :(得分:0)

有些问题不值得进行矢量化:

a = [3 ; 5 ; 2 ; 7 ; 4];
b = [7 ; 7 ; 5 ; 8 ; 4];

cols = max(max(a),max(b))
result = zeros(length(a),cols)

for i = 1:length(a)
    A = a(i):b(i)
    result(i,:) = padarray(A, [0 cols-length(A)], 0, 'post');
end