【问题标题】:save vectors of different sizes in matrix在矩阵中保存不同大小的向量
【发布时间】:2016-10-25 10:49:34
【问题描述】:

我想将一个向量划分为多个向量并将它们全部放入一个矩阵中。我收到此错误“下标分配维度不匹配”。

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) 获取“过滤”的值,我想将它存储在矩阵的第一行,然后对于迭代 2,我取“过滤”的值(50:70) 例如,我将它存储在矩阵的第 2 行,直到循环结束..

如果有人有想法,我不明白!谢谢!

【问题讨论】:

  • 问题是STEP的长度是50,但是在迭代2中你只给它(50:70),如何处理那些丢失的29位数字?这就是错误发生的原因。
  • 好的,谢谢你的回答。
  • 问题是我在这里举一个例子,取决于我的源文件,我不知道每次迭代时向量的大小。我只知道它不到50..
  • 在最后一步,编辑为:STEPS(1:numel(STEP),i) = STEP;?
  • 可以通过函数length:temp = filtered(locate(i):locate(i+1)); len = length(temp); STEP(1:len) = temp查询。

标签: matlab for-loop matrix vector


【解决方案1】:

如 cmets 中所述,要使其正常工作,您可以在末尾编辑循环代码 -

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

【讨论】:

  • 太棒了!这工作得更好,我学到了一些东西,我学到了一种让我的代码更快的新方法。谢谢!!
  • @YannLeMat 没问题!希望你能在更多地方以更多方式使用bsxfun,并用它做一些goodness ;)
  • 但是,这段代码稍微改变了我的行数据(我的意思是值的顺序)......因为“排序”
  • 之所以引入排序是因为locate(i):locate(i+1)导致数据重叠。我确实检查了最后的代码以验证输出。希望你也能重现它。
猜你喜欢
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 2020-11-18
  • 1970-01-01
  • 2015-09-20
相关资源
最近更新 更多