矩阵乘法和差分

时间:2018-11-12 10:32:21

标签: matlab matrix matrix-multiplication

我需要使用MATLAB计算此方程:

enter image description here

其中Sn既可以是矩阵也可以是标量,而我尝试使用

S_A = S_3*S_5*((ones-(S_1*S_5)).^(-1))*S_2+S_4

问题是它不能给我正确的结果,问题似乎在于enter image description here的不同,但我不知道为什么给我错误的结果。

结果应该是这个

enter image description here

但是MATLAB结果是

enter image description here

我不明白为什么两个结果不一样。 我认为的唯一方法就是通过

diff = ones-(S_1*S_5);
if S_1*S_5 == zeros         %Perchè senza non funziona?
    diff = ones;
else 
    diff = (ones-(S_1*S_5)).^(-1)
end
S_A = S_3*S_5*diff*S_2+S_4;

但是我认为这不是一个聪明的解决方案。有人知道为什么我没有得到正确的结果吗?

2 个答案:

答案 0 :(得分:5)

“我尝试用const path = require('path') module.exports = { rootDir: path.resolve(__dirname, '../../'), moduleFileExtensions: [ 'js', 'json', 'vue' ], moduleNameMapper: { '^@/(.*)$': '<rootDir>/src/$1' }, transform: { '^.+\\.js$': '<rootDir>/node_modules/babel-jest', '.*\\.(vue)$': '<rootDir>/node_modules/vue-jest' }, testPathIgnorePatterns: [ '<rootDir>/test/e2e' ], snapshotSerializers: ['<rootDir>/node_modules/jest-serializer-vue'], setupFiles: ['<rootDir>/test/unit/setup'], coverageDirectory: '<rootDir>/test/unit/coverage', collectCoverageFrom: [ 'src/**/*.{js,vue}', '!src/main.js', '!src/router/index.js', '!**/node_modules/**' ], testURL: 'http://localhost/unit-test' } 来做到这一点”

这里的问题是数学符号中的S_A = S_3*S_5*((ones-(S_1*S_5)).^(-1))*S_2+S_4意味着“取反”,而您使用A^(-1)时请注意点,在MATLAB的符号中意味着“将每个矩阵元素取幂” -1“。无论如何都是通过A. ^(-1)inv()来使用inverse of a matrix is not smart in MATLAB,而是使用mldivide

^(-1)

此外,如Brice's answer中所述,使用S_A = S_3*S_5*(eye(size(S_1*S_5,1))-(S_1*S_5))\S_2+S_4 而不是eye来创建一个单位矩阵,并为它提供一个size参数,而不是没有参数。总的来说,对您而言,您似乎对MATLAB的基本功能没有足够的了解,所以我想向您指出The MathWorks own tutorial on MATLAB

答案 1 :(得分:4)

ones输出一个填充有1的矩阵,而不是由函数eye给出的恒等矩阵。 您还需要指定oneseye的大小,否则它将只输出标量1(即填充1的1-by-1矩阵或1-by -1单位矩阵。

尝试(假设所有矩阵的大小相同):

siz=length(S_1);
S_A = S_3*S_5*((eye(siz)-(S_1*S_5))^(-1))*S_2+S_4