【问题标题】:Matlab: How to assign values selectively to a matrixMatlab:如何有选择地为矩阵赋值
【发布时间】:2014-03-16 16:56:00
【问题描述】:

我有 3 个 3*3 阶的矩阵 x、y 和 z。如果 (x.^2+y.^2+z.^2 > 1) 和否则值 = 0。 我正在尝试使用它:

  k(x.^2+y.^2+z.^2>1)= 1./(x.^2+y.^2+z.^2)

但它给出了错误:在赋值 A(I) = B 中,B 和 I 中的元素数必须相同。 任何人都可以在我不需要使用 for 循环的单行中提供一个简单的解决方案

【问题讨论】:

  • 如果 (x.^2+y.^2+z.^2 > 1) 对于任何 x、y'x 和 z 或所有 x、y 和 z?如果条件不成立,z 中的 9 个值是否都必须变为 0?
  • 我们根本不需要改变 z。我们必须逐元素检查 x.^2+y.^2+z.^2 的值
  • 在条件部分,您将 9 个值与 1 进行比较。所以我的问题是您要如何比较? all 9 个值应该大于 1 还是 any 9 个值大于 1?

标签: matlab matrix matlab-guide


【解决方案1】:

我不确定您为什么要这样做,而不是将其拆分为两个操作。这样,您就可以节省两次计算平方和的成本。

x = rand(3,3);
y = rand(3,3);
z = rand(3,3);
k = 1./(x.^2+y.^2+z.^2);
k(k>1)=0;

无论如何,另一种方法是使用函数式编程的原则:

x = rand(3,3);
y = rand(3,3);
z = rand(3,3);
myfun = @(x,y,z) 1/(x^2+y^2+z^2) * (x^2+y^2+z^2>1);
k = arrayfun(myfun, x, y, z);

或者,您可以将所有内容混合成一行:

k = arrayfun(@(x,y,z) 1/(x^2+y^2+z^2) * (x^2+y^2+z^2>1), x, y, z);

这段代码所做的是将函数myfun 映射到每个数据元素。函数myfun 非常简单。它计算所需的数量,但将其与绑定条件相乘。但是,您可能想要beware


编辑:解决评论。 如果您根本不想计算数量,我们可以使用条件匿名函数。更多详情可以参考this guide

iif = @(varargin) varargin{2 * find([varargin{1:2:end}], 1, 'first')}();
myfun = @(x,y,z) iif( x^2+y^2+z^2 <= 1, @() 0, x^2+y^2+z^2>1 ,@() 1/(x^2+y^2+z^2));
k = arrayfun(myfun, x, y, z);

【讨论】:

  • 实际上我只是希望 matlab 不应该为那些要分配零值的元素计算 1./(x.^2+y.^2+z.^2) 的值。你可以适当地修改来调整这个吗?
  • @Bosnia,我已经编辑了答案。使用新代码 sn-p,如果要分配 0,您将不会计算数量。
【解决方案2】:

怎么样

k = x.^2+y.^2+z.^2;
k(k < 1) = 0;
k(k~= 0) = 1 ./ k(k~=0);

【讨论】:

    【解决方案3】:

    如果您想节省一些处理时间(即,对于小于 1 的情况,根本不计算平方和),那么几乎唯一的解决方案就是查找表 否则下面的代码应该可以工作

    k=1./(x.^2+y.^2+z.^2)
    k(k<=1)=0
    

    您可以缩短一些时间(假设 x、y 和 z 可能大于 1)

    idx0=x<1 & y<1 & z<1
    k=zeros(3)
    k(idx0)=1./(x(idx0).^2+y(idx0).^2+z(idx0)^2)
    k(k<=1)=0
    

    如果您将原始解决方案更改为使用索引器,您的原始解决方案将起作用(我没有对其进行分析,但我很确定它需要的时间比我的要长:))

    idx0=x.^2+y.^2+z.^2>1
    k=zeros(3)
    k(idx0)=1./(x(idx0).^2+y(idx0).^2+z(idx0)^2)
    

    【讨论】:

    • 我正在尝试为那些要分配零的元素节省 1./(x.^2+y.^2+z.^2) 的计算。 (实际上是1./(x.^2+y.^2+z.^2)的复杂函数,计算时间长)
    • 在您的原始示例中,可以修改为工作,对于每个元素将多次计算平方和(一个在条件语句中,一个在符合条件的情况下)。我的至少保存了第二次。无论如何,x,y,z的类型和取值范围是什么,你需要的结果精度是多少?
    • type double x,y,z 是从 0-5.038
    猜你喜欢
    • 2012-10-19
    • 1970-01-01
    • 2023-04-10
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    相关资源
    最近更新 更多