0

我正在尝试通过在 for 循环中在该数组上附加单个列来构造一个数组。我这样做是通过首先初始化一列零并将我读取的每个新列放在更新向量的右侧。但不幸的是,这部分有效,并且只有在做出限制之后,即只保留第一个 - 例如 - 每个新向量的 500 行。

关于下面关于问题的解决方案,首先我不明白为什么这个零列向量没有出现在最后一个数组中!另一个问题是,即使我从一开始就知道最终数组的总列数,在某些情况下,我也不知道单独列的实际行数。实际上,我想考虑,作为我最终数组中的默认行数,要附加的不同单列之间的行数越大,所以我假设,最好的做法应该是运行整个列数决定更大的行数,然后设置初始数组的适当维度以由单列数据填充,最后根据后者填充第一个。

任何建议将不胜感激!

data = zeros(500,1);
for symbol = 1:length(symbol_list),
    [hist_data] = retrieve_data(symbol_list(symbol));
    data = [data hist_data(1:500)];
end

编辑:

让我给你一个输入/输出的例子:

我想放置以下三列(我在每次迭代中检索其中一列)

0.402513860949959   0.401546899405730   0.405949059210334
0.401396441661866   0.400288848738267   0.403936753893693
0.400862023741474   0.402233108860710   0.404473368644797
0.411161714570851   0.413612748989126   0.409437055092511
0                   0.414870799656589   0.415071509979105
0                   0.416586323294039   0

一个接一个,最后得到下表(只保留行数较大但行数相同的表 - 因此,这里我只保留第二列):

0.401546899405730
0.400288848738267
0.402233108860710
0.413612748989126
0.414870799656589
0.416586323294039

换句话说,我有很多列,我想一个接一个地附加。它们中的大多数具有相同的非常大的行长度。但是,其他一些具有任意较小的行数(长度)。我什么是找到这个“大”行数,只保留与这个“大”长度相对应的列,最后将一个放在另一个旁边。

4

2 回答 2

2

我认为您最好使用元胞数组来存储从retrieve_data 获得的数据,因为您正在处理具有不同行数的列。在单元格数组中收集所有内容后,您仍然可以通过填充较短的行或修剪较长的行来转换为标准矩阵。

c={[1 2 3 4]',[2 43 5]', [1 2]' , [2 5 6 7 3]'}
sizesC = cellfun(@length,c)
% pad to maximal size with Nan's
for el=1:length(c)
    c{el}(sizesC(el)+1:max(sizesC))=NaN;
end
% Trim to minimal size
c={[1 2 3 4]',[2 43 5]', [1 2]' , [2 5 6 7 3]'}
for el=1:length(c)
    c{el}(min(sizesC)+1:end)=[];
end
% Convert rectangular cellarray to matrix
m=cell2mat(c)
于 2012-06-09T10:31:40.883 回答
1

我不确定我是否遵循了您的大部分问题,因此这可能不是您提出的问题的答案...

如果您尝试构建的数据结构不是真正的数组,例如,如果它真的是长度不等的向量列表,那么普通的旧数组可能不是在 Matlab 中使用的最佳数据结构。这可能是实际的选择,但单元阵列可能是更好的选择。

如果数组是正确或实用的选择,那么大多数有经验的 Matlab 用户通常认为通过在每个循环中添加一个新列来构建它是一个非常糟糕的想法。以这种方式构建数组在时间上可能非常昂贵,并且还可能导致内存问题。无论如何,这是一般的想法,没有人会强迫你遵循这个想法。

一种更好的方法是将数组分配为大块。在理想的 (?) 情况下,您将一次性分配整个数组,使用如下语句

data = zeros(500,462);

然后将数据写入循环内的每一列。如果您不知道最终需要的列数,则创建一个可能足够大的数组;如果你用完了空间,一次添加N列,继续循环。必要时重复。N 的一个好的选择在很大程度上取决于您的问题和您的数据。

逐列(或逐行)构建(大)数组的原因是,每当您添加新列 Matlab 时:

  1. 为新的更大的数组获取足够的空闲内存;
  2. 将旧内存位置的值复制到新内存位置;
  3. 返回存储旧版本数组的内存块到空闲内存池(或 Matlab 实际调用的任何内存池)

重复执行此操作可能需要很多时间。它还可能导致过多的内存碎片,返回到池中的内存块都不会大到可以用于同一数组的更高版本;如果你的内存使用模式错误,你最终会发现被释放的块占用的内存对于任何新数组来说都太小了,但是对于这里和那里的奇数标量来说,你需要的内存就太大了。这更多的是概率而不是确定性,但在将数据塞入盒子中的每个字节时值得牢记。

于 2012-06-09T10:33:11.420 回答