我正在MATLAB中编写一个函数,以根据其中一个列值计算若干矩阵。
例如B=
1.0000 0 0.3000
0 0 0.3000
以此类推。第3列在不同的矩阵中是不同的,但是在整个矩阵中是相同的。第三列的值可以是。2:.05:。每种我都有一个箱子。
我正在经历一些非常奇怪的结果。当多次运行switch case时,尽管我可以清楚地看到switch语句被赋值为。3,但是。3的case始终不起作用。我对这个问题进行了更精确的研究,开关变量和情况肯定是相同的。
我已经粘贴了下面一段更完整的代码。函数twolayer返回[0/1 0/1比特率],比特率是开关变量。请让我知道,如果有什么我做错了,当实施开关情况。我已经尝试了相同的代码使用if elseif,并遇到了同样的问题,我相信这是MATLAB如何比较数字的问题。提前感谢!
for k=1:15
A(k,1:3)=twolayer(j,X(1,i));
end
%Sort the matrix by bitrate
B=sortrows(A,3);
ref=B(1,3);
%find the index at which the sorted matrix switches bitrate
c=1;
while B(c,3)==ref
c=c+1;
end
c=c-1;
%Split the matrix by indicated bitrate
C(1:c,1:3)=B(1:c,1:3)
D(1:(15-c),1:3)=B((c+1):15,1:3)
c=0;
%Check each matrix by bitrate then add it's average and
%record the increase in counter
check = double(C(1,3))
switch check
case 0.2000
cbrbaselayer(j-2,1)=(cbrbaselayer(j-2,1)+(mean(C(:,1))));
counterone=counterone+1;
'Counter One Increased'
case 0.2500
cbrbaselayer(j-2,2)=(cbrbaselayer(j-2,2)+(mean(C(:,1))));
countertwo=countertwo+1;
'Counter Two Increased'
case 0.3000
cbrbaselayer(j-2,3)=(cbrbaselayer(j-2,3)+(mean(C(:,1))));
counterthree=counterthree+1;
'Counter Three Increased'
case 0.3500
cbrbaselayer(j-2,4)=(cbrbaselayer(j-2,4)+(mean(C(:,1))));
counterfour=counterfour+1;
'Counter Four Increased'
case 0.4000
cbrbaselayer(j-2,5)=(cbrbaselayer(j-2,5)+(mean(C(:,1))));
counterfive=counterfive+1;
'Counter Five Increased'
case 0.4500
cbrbaselayer(j-2,6)=(cbrbaselayer(j-2,6)+(mean(C(:,1))));
countersix=countersix+1;
'Counter Six Increased'
case 0.5500
cbrbaselayer(j-2,8)=(cbrbaselayer(j-2,8)+(mean(C(:,1))));
countereight=countereight+1;
'Counter Eight Increased'
case 0.6000
cbrbaselayer(j-2,9)=(cbrbaselayer(j-2,9)+(mean(C(:,1))));
counternine=counternine+1;
'Counter Nine Increased'
case 0.6500
cbrbaselayer(j-2,10)=(cbrbaselayer(j-2,10)+(mean(C(:,1))));
ounterten=counterten+1;
'Counter Ten Increased'
case 0.7000
cbrbaselayer(j-2,11)=(cbrbaselayer(j-2,11)+(mean(C(:,1))));
countereleven=countereleven+1;
'Counter Eleven Increased'
case 0.7500
cbrbaselayer(j-2,12)=(cbrbaselayer(j-2,12)+(mean(C(:,1))));
countertwelve=countertwelve+1;
'Counter Twelve Increased'
case 0.8000
cbrbaselayer(j-2,13)=(cbrbaselayer(j-2,13)+(mean(C(:,1))));
counterthirteen=counterthirteen+1;
'Counter Thirteen Increased'
end
check = double(D(1,3))
switch check
case 0.2000
cbrbaselayer(j-2,1)=(cbrbaselayer(j-2,1)+(mean(D(:,1))));
counterone=counterone+1;
'Counter One Increased'
case 0.2500
cbrbaselayer(j-2,2)=(cbrbaselayer(j-2,2)+(mean(D(:,1))));
countertwo=countertwo+1;
'Counter Two Increased'
case 0.3000
cbrbaselayer(j-2,3)=(cbrbaselayer(j-2,3)+(mean(D(:,1))));
counterthree=counterthree+1;
'Counter Three Increased'
case 0.3500
cbrbaselayer(j-2,4)=(cbrbaselayer(j-2,4)+(mean(D(:,1))));
counterfour=counterfour+1;
'Counter Four Increased'
case 0.4000
cbrbaselayer(j-2,5)=(cbrbaselayer(j-2,5)+(mean(D(:,1))));
counterfive=counterfive+1;
'Counter Five Increased'
case 0.4500
cbrbaselayer(j-2,6)=(cbrbaselayer(j-2,6)+(mean(D(:,1))));
countersix=countersix+1;
'Counter Six Increased'
case 0.5500
cbrbaselayer(j-2,8)=(cbrbaselayer(j-2,8)+(mean(D(:,1))));
countereight=countereight+1;
'Counter Eight Increased'
case 0.6000
cbrbaselayer(j-2,9)=(cbrbaselayer(j-2,9)+(mean(D(:,1))));
counternine=counternine+1;
'Counter Nine Increased'
case 0.6500
cbrbaselayer(j-2,10)=(cbrbaselayer(j-2,10)+(mean(D(:,1))));
counterten=counterten+1;
'Counter Ten Increased'
case 0.7000
cbrbaselayer(j-2,11)=(cbrbaselayer(j-2,11)+(mean(D(:,1))));
countereleven=countereleven+1;
'Counter Eleven Increased'
case 0.7500
cbrbaselayer(j-2,12)=(cbrbaselayer(j-2,12)+(mean(D(:,1))));
countertwelve=countertwelve+1;
'Counter Twelve Increased'
case 0.8000
cbrbaselayer(j-2,13)=(cbrbaselayer(j-2,13)+(mean(D(:,1))));
counterthirteen=counterthirteen+1;
'Counter Thirteen Increased'
end
clear A; clear B; clear C; clear D; clear check; clear c;
首先,代码很长。编程是为了让你的生活更轻松。不困难。
这是我改进switch语句的建议,写两个子函数,一个用于C,一个用于D
function checkC(inputvalue)
index = (inputvalue-0.2)/0.05 +1;
cbrbaselayer(j-2,index)=(cbrbaselayer(j-2,index)+(mean(C(:,1))));
eval(sprintf(counter%d = counter%d +1,index,index));
end
function checkD( inputvalue)
index = (inputvalue-0.2)/0.05 +1;
cbrbaselayer(j-2,index)=(cbrbaselayer(j-2,index)+(mean(D(:,1))));
eval(sprintf(counter%d = counter%d +1,index,index));
end