在MATLAB中迭代插入数组列

时间:2012-06-09 09:59:47

标签: arrays matlab

我试图通过在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

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

我不确定我是否回答了你的大部分问题,所以这可能不是你提出的问题的答案......

如果您尝试构建的数据结构实际上不是数组,例如,如果它实际上是不等长度的向量列表,则普通旧数组可能不是在Matlab中使用的最佳数据结构。这可能是一个实际的选择,但cell array可能是更好的选择。

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

更好的方法是将数组分配到大块中。在理想的(?)情况下,您将使用诸如

之类的语句一次性分配整个数组
data = zeros(500,462);

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

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

  1. 为新的更大的阵列抓住足够的可用内存;
  2. 将旧内存位置的值复制到新内存位置;
  3. 将存储旧版本数组的内存块返回到空闲内存池(或Matlab实际调用它的任何内容)
  4. 反复这样做可能会花费很多时间。它也可能导致过多的内存碎片,返回池中的内存块都不会大到足以用于同一阵列的更高版本;得到你的内存使用模式错误,你最终会释放被释放的块占用的内存,这些块对于任何新阵列来说都太小了,但是你可以在这里和那里找到你需要的奇数标量。这更像是一种概率而非确定性,但在将数据塞入方框中的每个字节时都要记住这一点。