【问题标题】:Matlab -- Copy Structure Array without For LoopMatlab - 复制没有For循环的结构数组
【发布时间】:2014-10-26 18:30:12
【问题描述】:

我在 Matlab 中有一个相当简单的问题。我想将 n 项结构数组 (sumRT.P) 复制到矩阵 (m) 中。在 C 语言中,我只会使用 for 循环,如下所示:

for i = 1:n    
    m(i) = sumRT(i).P;
end

但我敢打赌,有一种更简单的方法可以在 Matlab 中复制数组(这就是语言的全部意义,对吧?)。我试过这个:

m = sumRT(1:n).P;

但这只是将 sumRT.P 中的第一项复制到 m,从而产生一个 1 X 1 矩阵。请注意,如果我键入 sumRT(2).P 例如,我可以看到第二项。直到 n 的任何数字都相同。为什么这是错误的,我该如何解决?

【问题讨论】:

    标签: matlab for-loop matrix copy structure


    【解决方案1】:

    这取决于结构数组中的数据类型。如果是变量的类型,或者是不同维度数组中大小相同的变量,则不能将它们放入数组中,但可以将它们放入单元格中:

    m={sumRT(1:n).P}
    

    而且细胞很容易处理,所以这应该不是什么大问题。

    如果都是标量数值,可以创建矩阵:

    m=cell2mat({sumRT(1:n).P})
    

    【讨论】:

    • 太棒了!使用您的示例,这是我的问题的解决方案: m = cell2mat({sumRT(1:n).P});我实际上并不完全清楚某些结构数组如何变成单元格。它在我的 Matlab 生活中造成了一些问题。有什么建议吗?我有一本关于 Matlab 的书——但不是很全面。那里有没有好的 Matlab“圣经”(例如,像 Schildt 的 C 手册)?
    • 太棒了!我的答案确实混淆了符号,看起来你还是算出来了。
    【解决方案2】:

    尝试以下方法:

    m = squeeze(cell2mat(struct2cell(sumRT(1:n))));
    

    这会将结构数组转换为元胞数组,然后转换为(数字)数组,然后通过删除单维数来压缩它。

    例子:

    >> sumRT(1).P = 10; sumRT(2).P = 20; sumRT(3).P = 30;
    >> n = 2; %// copy first two elements only
    >> m = squeeze(cell2mat(struct2cell(sumRT(1:n))))
    m =
        10
        20
    

    【讨论】:

    • 我收到以下代码错误:使用 cell2mat 时出错(第 45 行)输入元胞数组的所有内容必须是相同的数据类型。
    • 所以,我尝试将您的代码编辑为: m4 = squeeze(cell2mat(struct2cell(sumRT(1:n).P))) 并收到此错误消息。 'double' 类型的输入参数的未定义函数'struct2cell'。
    • 您还没有告诉我们sumRT(1).PsumRT(2).P 的内容是什么。我假设它们是数字;在这种情况下,我的代码确实有效(参见我的示例)
    • 我可以看到您的代码适用于您的数据。但这对我不起作用。内容是双倍的。
    • 既然你说m = sumRT(1:n).P; 产生一个 1x1 矩阵,我不得不假设字段内容是标量。下次,请详细说明您的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多