0

我有两个矩阵ab1 列和n行。

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

从这些我需要创建一个n x m矩阵。 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
4

2 回答 2

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
于 2012-11-01T17:07:38.530 回答
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
于 2012-11-01T17:30:56.733 回答