我需要使用MATLAB计算此方程:
其中Sn
既可以是矩阵也可以是标量,而我尝试使用
S_A = S_3*S_5*((ones-(S_1*S_5)).^(-1))*S_2+S_4
问题是它不能给我正确的结果,问题似乎在于的不同,但我不知道为什么给我错误的结果。
结果应该是这个
但是MATLAB结果是
我不明白为什么两个结果不一样。 我认为的唯一方法就是通过
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;
但是我认为这不是一个聪明的解决方案。有人知道为什么我没有得到正确的结果吗?
答案 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
给出的恒等矩阵。
您还需要指定ones
或eye
的大小,否则它将只输出标量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