【问题标题】:How to replace/modify something in a call to function 1 from within function 2 (both in their separate files)如何在函数 2 中调用函数 1 时替换/修改某些内容(都在各自的文件中)
【发布时间】:2015-03-14 11:29:12
【问题描述】:

给定的任务是从另一个函数中调用一个函数,这两个函数都在处理矩阵。

现在让我们调用这个函数 1,它在它自己的文件中:

A = (1/dot(v,v))*(Ps'*Ps);

函数 1 使用命令调用:

bpt = matok(P);

现在在函数 1 所在的同一文件夹中的另一个文件 (matok.m) 中,我们创建另一个包含调用函数 1 的函数 2 的文件:

bpt = matok(P);

我希望 B 在技术上做的是返回以下结果(其中 D 是对角矩阵):

忽略此行:B = (1/dot(v,v))*(Ps'*inv(D)*Ps*inv(D);

编辑:这是正确的B = (1/dot(v,v))*(Ps*inv(D))'*Ps*inv(D);

但是 B 不应该“重新编码”已经在函数 1 中编写的内容,挑战/任务是在函数 2 中调用函数 1,在函数 2 中,我们使用函数 1 的输出来结束B 给我们的结果。也因为在矩阵世界中,AB 不等于 BA,那么我不能简单地与 inv(D) 相乘。现在由于我不允许如上所示写 B,我正在考虑替换(不更改函数 1,在函数 2 中进行操作):

(Ps'*Ps)

(Ps'*inv(D)*Ps*inv(D)

这在某种程度上我认为应该是可能的,但由于我是 Matlab 的新手,不知道该怎么做,甚至不知道从哪里开始。关于如何达到预期结果的任何想法?

我错过了一个小细节:

这里的转置不应该是 Ps:

B = (1/dot(v,v))*(Ps'*inv(D))*Ps*inv(D);

而是Ps和inv(D)的转置:

B = (1/dot(v,v))*(Ps*inv(D))'*Ps*inv(D);

我找到了这个解决方案,但它可能没有压缩到应有的程度,而且在我看来有点不雅,也许还有更短的方法?:

C = pinv(Ps') * A
E = (Ps*inv(D))' * C

【问题讨论】:

  • PsP 一样吗? v 来自哪里?
  • No Ps 和 P 不一样,Ps 是从其他代码行中的 P 计算出来的。 v 只是一个列向量。
  • 不知道Ps 来自哪里,这似乎是不可能的。你能提供一个最小的例子吗?
  • 我还想要一个最小的工作示例。
  • 你可以尝试传入 D 并在没有提供 D 时使用 nargin 创建一个默认的 eye(size) D。

标签: matlab function matrix matrix-multiplication matrix-inverse


【解决方案1】:

由于 (A*B)' = B'*A',你可能只需要调用

matok(inv(D) * Ps)

【讨论】:

  • 不起作用,添加返回错误。也试过了,我认为这会更正确,以反映 B 中的顺序:matok(Ps*inv(D)),它返回相同的错误:Error using * Inner matrix dimensions must agree.
  • 找出为什么它不起作用,因为 Ps' 和 D 之间的内部暗淡不匹配,这是一个被忽视的小细节:我错过的一个小细节(在主帖中更新):在这个 ``B = (1/dot(v,v))*(Ps'inv(D))*Psinv(D);` 中转置不应该是 Ps,而是Ps 和 inv(D) 的转置 'B = (1/dot(v,v))*(Psinv(D))'*Psinv(D);'我找到了这个解决方案,但它可能没有像以前那样压缩,而且在我看来有点不雅,也许还有更短的版本?:'C = pinv(Ps') * A' 'E = (Ps*inv(D))' * C'
猜你喜欢
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
相关资源
最近更新 更多