【问题标题】:Array of structures - doing operation on matrix within field without loop结构数组 - 在没有循环的字段内对矩阵进行操作
【发布时间】:2012-06-27 21:11:28
【问题描述】:

我有以下称为 test 的结构数组,其中每个字段都是包含矩阵的 [1x3] 结构数组。我想创建一个新字段,levelsq,它对每个矩阵的元素进行平方。我可以通过循环来做到这一点:

[test(1:3).level] = deal([1,1],[2,2],[3,3])

for i = 1:3
   test(i).levelsq = test(i).level.^2
end

test.level
ans =
     1     1
ans =
     2     2
ans =
     3     3

test.levelsq
ans =
     1     1
ans =
     4     4
ans =
     9     9

我已经通过分离和连接元素获得了一些方法,但还不能添加新字段:

temp = num2cell([test.level].^2) 
test.levelsq = temp{:}
??? Illegal right hand side in assignment. Too many elements.

然后我尝试重塑临时变量,但它仍然不是正确的形式

temp2= reshape(temp,2,3)'
temp2 = 
[1]    [1]
[4]    [4]
[9]    [9]

有没有更简单的方法可以做到这一点而无需循环或分离内容?谢谢。

【问题讨论】:

    标签: arrays matlab struct


    【解决方案1】:
    test = arrayfun(@(x) setfield(x, 'levelsq', x.level .^ 2), test);
    

    顺便说一句,如果您设置列向量,您可以轻松访问数组的值:

    >> [test.level]
    
    ans =
    
         1     2     3
         1     2     3
    
    >> [test.levelsq]
    
    ans =
    
         1     4     9
         1     4     9
    

    【讨论】:

      【解决方案2】:

      您可能需要考虑您的应用程序需要哪些数据类型。您当前正在使用数值数组、元胞数组和结构(即双重嵌套结构!)。

      “Matlab”方法是使用数字数组(也称为矩阵)来完成所有这些操作。它们经过高度优化,非常有利于数学运算。

      你可以这样做:

      level = [ 1 1; 2 2; 3 3;];
      levelsq = level.^2;
      

      如果您想要一个数据结构同时保存levellevelsq,您可以将两者连接成一个三维矩阵:

      test = cat(3, level, levelsq);
      

      您可以通过调用test(:,:,1) 访问level,并通过调用test(:,:,2) 访问levelsq。

      另一方面,如果你需要保留你正在使用的数据结构,你就无法击败@Serg。

      【讨论】:

      • 感谢您的反馈。我最初使用矩阵对我的问题进行了编码,但是尺寸非常大(> 10),因此我尝试使用结构来重新组织/跟踪所有移动部件。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多