将不同大小的向量保存在矩阵中

3
我想把一个向量分成多个向量,并把它们放入矩阵中。但我遇到了“下标赋值维度不匹配”的错误提示。
STEP = zeros(50,1);
STEPS = zeros(50,length(locate));
for i = 1:(length(locate)-1)
    STEP = filtered(locate(i):locate(i+1));
    STEPS(:,i) = STEP;
end

我假设第一次从(1:50)中获取“filtered”的值,并将其存储在矩阵的第一行,然后对于迭代2,例如从(50:70)中获取“filtered”的值,并将其存储在矩阵的第二行,以此类推,直到循环结束。如果有人有想法,请给我留言!谢谢!

问题在于STEP的长度为50,但在第二次迭代中你只给了(50:70),如何处理那29个缺失的数字?这就是错误的原因。 - Gnimuc
好的,谢谢你的回答。 - YLM
问题在于我这里举了一个例子,取决于我的源文件,我不知道每次迭代向量的大小。我只知道它小于50。 - YLM
在最后一步,编辑为:STEPS(1:numel(STEP),i) = STEP; - Divakar
你可以通过函数 length 进行查询:temp = filtered(locate(i):locate(i+1)); len = length(temp); STEP(1:len) = temp - Gnimuc
太棒了,伙计!它完美地运行了!谢谢你!! :) - YLM
1个回答

2

如评论中所提到的,要使其工作,您可以在末尾编辑循环代码,方法如下 -

STEPS(1:numel(STEP),i) = STEP;

此外,输出数组STEPS似乎没有使用最后一列。因此,初始化可以使用一个更少的列,像这样 -
STEPS = zeros(50,length(locate)-1);

对于循环代码来说一切都很好,但是对于像MATLAB这样的高级语言,您可能希望寻找更快的代码,其中一种方法是使用矢量化代码。因此,让我建议使用bsxfun的掩码功能来处理这种不规则数组的矢量化解决方案。涵盖locate中通用元素的实现看起来应该像这样 -

% Get differentiation, which represent the interval lengths for each col
diffs = diff(locate)+1;

% Initialize output array
out = zeros(max(diffs),length(locate)-1);

% Get elements from filtered array for setting into o/p array
vals = filtered(sort([locate(1):locate(end) locate(2:end-1)]));

% Use bsxfun to create a mask that are to be set in o/p array and set thereafter
out(bsxfun(@ge,diffs,(1:max(diffs)).')) = vals;

验证样例运行 -

>> % Inputs
locate = [6,50,70,82];
filtered = randi(9,1,120);

% Get extent of output array for number of rows
N = max(diff(locate))+1;

>> % Original code with corrections
STEP = zeros(N,1);
STEPS = zeros(N,length(locate)-1);
for i = 1:(length(locate)-1)
    STEP = filtered(locate(i):locate(i+1));
    STEPS(1:numel(STEP),i) = STEP;
end

>> % Proposed code
diffs = diff(locate)+1;
out = zeros(max(diffs),length(locate)-1);
vals = filtered(sort([locate(1):locate(end) locate(2:end-1)]));
out(bsxfun(@ge,diffs,(1:max(diffs)).')) = vals;

>> max_error = max(abs(out(:)-STEPS(:)))
max_error =
     0

太棒了!这个方法甚至更好,我学到了新的东西,也学到了一种让我的代码更快的方法。谢谢你! - YLM
1
@YannLeMat 没问题!希望你能在更多的地方以更多的方式使用bsxfun,并做出一些好事;) - Divakar
然而,这段代码会稍微改变我的行数据(我是指值的顺序)……因为使用了“sort”函数。 - YLM
这种排序是因为locate(i):locate(i+1)存在数据重叠。我已经在我的端口检查了代码以验证输出。希望你也能够复现它。 - Divakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接