【问题标题】:Vector operations on object-array with 'colon' indexing [MATLAB]带有“冒号”索引的对象数组上的向量运算 [MATLAB]
【发布时间】:2016-01-31 19:29:48
【问题描述】:

在我的 Matlab 代码中,我有一个“质量”对象数组,它是一个描述质量、速度、加速度等的类的对象。

为了加快模拟速度,我想通过使用更多向量运算来减少 for 循环的使用。其中一项操作是获取当前质量与所有其他质量的距离。

我想这样解决:

%position is a vector with x and y values e.g. [1 2]
%repeat the current mass as many times as there are other masses to compare with
currentMassPosition = repmat(obj(currentMass).position, length(obj), 2);      
distanceCurrentMassToOthersArray = obj(:).position - currentMassPosition;

我不能对对象数组使用冒号索引操作。目前我使用一个 for 循环来遍历每个对象。您有什么技巧可以在不使用 for 循环的情况下对其进行优化吗?

我希望我的问题足够清楚,否则我会优化它;)。

【问题讨论】:

  • 我建议避免使用 Matlab 中的对象,如果你可以用其他方法做同样的事情。如果您仍然想要一个将多个变量“组合”在一起的对象,请考虑创建一个数组对象而不是对象数组,这样您就可以调用obj.position(:) 进行矢量化操作。
  • 感谢您的提示。由于我的挑战,我想以面向对象的方式学习编码。我确信我做得并不完美。

标签: matlab class object vector indexing


【解决方案1】:

我使用此代码重现了您的问题。对于未来的问题,请尝试在您的问题中包含此类示例:

classdef A
    properties
        position
    end
    methods
        function obj=A()
            obj.position=1;
        end
    end
end

.

%example code to reproduce
x(1)=A
x(2)=A
x(3)=A
%line which causes the problem
x(:).position-3

要了解为什么这不起作用,请查看x(:).position 的输出,只需将其输入控制台即可。你会得到多个ans 值,表示comma separated list of multiple values。如果你改用[x(:).position],你会得到一个双精度数组。正确的代码是:

[x(:).position]-3

【讨论】:

  • 非常有帮助!非常感谢您的努力。明天试试看。
猜你喜欢
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
相关资源
最近更新 更多