对角线与非零元素

6视图(30天)
你好,
我有一个矩阵,并计算所有可能的(n的阶乘)排列的矩阵。接下来,我要计算的总和的对角线交换矩阵包含 非零元素 。我写一个嵌套循环检查为非零元素,然后,如果没有零元素,我想保存对角线和“诊断接头”。但它仍然保存对角线金额,包含零元素。
与非零矩阵A的所有排列,对角线,有恒定对角线和1.6。这意味着,如果代码的工作方式,它应该只找到对角线和1.6
%定义一个
一个= [0 0.4 0.3 0.3;0 0 0.5 - 0.5;0.5 - 0.3 0 0.2;0.5 0.3 0.2 0);
[n, n] =大小(一个);
%找到所有的排列
B =重塑((:,flipud(烫发(1:4)。”),n, n的阶乘(n));
%计算对角金额与非零元素
诊断接头= 0(1阶乘(n));
i = 1:阶乘(n)
j = 1: n
如果B (j, j,我)= = 0
打破
结束
诊断接头(1,)=跟踪(B(:,:我));
结束
结束
诊断接头

接受的答案

里卡多。Scorretti
里卡多。Scorretti 2022年5月2日
编辑:里卡多。Scorretti 2022年5月2日
嗨,英格丽德,
我猜你的意思是你想计算te和对角线的交换矩阵包含 所有 非零元素。在这种情况下,我想这样的程序:
%定义一个
一个= [0 0.4 0.3 0.3;0 0 0.5 - 0.5;0.5 - 0.3 0 0.2;0.5 0.3 0.2 0);
你写的: [n, n] =大小(一个) 。这是奇怪的(对我来说),我宁愿这样的程序:
[n m] =大小(一个);% * * *
断言(n = = m,“矩阵必须广场!”)% * * *
%找到所有的排列
B =重塑((:,flipud(烫发(1:4)。”),n, n的阶乘(n));
我需要使用内置的函数 诊断接头 ,所以我不得不重命名 诊断接头 diag_
%计算对角金额与非零元素
diag_ = 0(1阶乘(n));%诊断接头函数具有相同名称的“阴影”
i = 1:阶乘(n)
如果任何(诊断接头(B(:,:我))= = 0),继续;结束
diag_ (i) =跟踪(B(:,:我));
结束
diag_”
ans = 24×1
0 0 0 0 0 0 0 0 0 1.6000
程序的错误是:
%定义一个
一个= [0 0.4 0.3 0.3;0 0 0.5 - 0.5;0.5 - 0.3 0 0.2;0.5 0.3 0.2 0);
[n, n] =大小(一个);
%找到所有的排列
B =重塑((:,flipud(烫发(1:4)。”),n, n的阶乘(n));
%计算对角金额与非零元素
诊断接头= 0(1阶乘(n));
i = 1:阶乘(n)
j = 1: n
如果B (j, j,我)= = 0
考虑这样一种情况: B (:,:, j) = (1 0 0 0;0 2 0 0;0 0 0 0;0 0 0 0] 。在前两个迭代 B (j, j,我)~ = 0 ,所以你分配 我诊断接头(1) 的痕迹 B(:,:,我) 。但在第三次迭代中, B (3 3 i) = 0 :如果你打破这个循环,它是强制性的重置价值 诊断接头(j) 为0,否则它将存储错误的结果。
顺便说一句,在这个算法的计算跟踪无益地重复很多次。
我诊断接头(1)= 0;%这是失踪
打破
结束
诊断接头(1,)=跟踪(B(:,:我));
结束
结束
诊断接头
诊断接头= 1×24
0 0 0 0 0 0 0 0 0 1.6000 1.6000 0 0 0 0 0 0 0 0 0 1.6000 1.6000 1.6000 - 1.6000
当然,两个版本完全相同的结果。

答案(1)

大卫。马塞罗说道
大卫。马塞罗说道 2022年5月2日
编辑:大卫。马塞罗说道 2022年5月2日
%定义一个
一个= [0 0.4 0.3 0.3;0 0 0.5 - 0.5;0.5 - 0.3 0 0.2;0.5 0.3 0.2 0);
[n, n] =大小(一个);
%找到所有的排列
B =重塑((:,flipud(烫发(1:4)。”),n, n的阶乘(n));
%计算对角金额与非零元素
dgnl = [];
i = 1:阶乘(n)
如果(诊断接头(B(:,:我))~ = 0)
dgnl = [dgnl总和(诊断接头(B(:,:我))));
结束
结束
dgnl
dgnl = 1×6
1.6000 1.6000 1.6000 1.6000 1.6000 1.6000
最好不要使用 诊断接头 作为变量名,因为它已经是一个MatLab内置函数。

类别

找到更多的在作用于对角矩阵帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!