% % 读取数据 data = readmatrix('G:\19\19\2.xls'); % % % 生成标签 labels = repmat(1:14, 100, 1); labels = labels(:); % % 计算准确率 accuracy = zeros(14, 1); for i = 1:14 start_idx = (i-1)100 + 1; end_idx = i100; accuracy(i) = sum(data(start_idx:end_idx, 1) == labels(start_idx:end_idx)) / 100; end for i = 1:14 idx = find(data(:, 1) == i); correct = sum(data(idx, 2) == i); accuracy(i) = correct / length(idx); end % 生成混淆矩阵 confusionMat = confusionmat(labels, data(:, 2)); figure newLabels = {'2FSK', 'BPSK', 'CW', 'LFM', 'LFM-BPSK', 'QPSK', 'NLFM', 'FSK-BPSK', 'LFM-FSK', 'MPSK', 'T1', 'T2', 'T3', 'T4'}; confusionchart(confusionMat,newLabels ,'Normalization', 'row-normalized'); % 将百分比符号添加到矩阵中 h = gca; h.Axes.XTickLabelFormat = '%.1f%%'; h.YAxis.TickLabelFormat = '%.1f%%';这段代码有问题吗?可以画出每个格子内带有百分比的数值的混淆矩阵吗?用2019a的matlab,如果不行,那应该怎么修改呢
时间: 2023-07-16 14:13:00 浏览: 99
这段代码有一些问题:
1. 第一段计算准确率的循环中,变量 `accuracy` 每次都被重新赋值,应该将 `zeros(14, 1)` 放在循环外面,只需要在每次循环中更新对应的元素。
2. 第二段计算准确率的循环中,变量 `accuracy` 又被重新赋值了,这会导致第一段循环中计算的准确率被覆盖掉。可以将第二段循环改为更新 `confusionMat` 的同时计算准确率。
3. 在画混淆矩阵时,标签应该是字符串数组,而不是数字数组。可以将第一段生成标签的代码改为 `labels = repmat(newLabels, 100, 1); labels = labels(:);`
4. 在设置坐标轴标签格式时,应该使用 `YTickLabelFormat` 而不是 `YAxis.TickLabelFormat`。
下面是修改后的代码:
```
data = readmatrix('G:\19\19\2.xls');
% 生成标签
newLabels = {'2FSK', 'BPSK', 'CW', 'LFM', 'LFM-BPSK', 'QPSK', 'NLFM', 'FSK-BPSK', 'LFM-FSK', 'MPSK', 'T1', 'T2', 'T3', 'T4'};
labels = repmat(newLabels, 100, 1);
labels = labels(:);
% 计算准确率和混淆矩阵
accuracy = zeros(14, 1);
confusionMat = zeros(14);
for i = 1:14
start_idx = (i-1)*100 + 1;
end_idx = i*100;
accuracy(i) = sum(data(start_idx:end_idx, 2) == i) / 100;
idx = find(labels == newLabels{i});
confusionMat(i, :) = histcounts(data(idx, 1), 1:15);
end
% 画混淆矩阵
figure
confusionchart(confusionMat, newLabels, 'Normalization', 'row-normalized');
h = gca;
h.Axes.XTickLabelFormat = '%.1f%%';
h.YTickLabelFormat = '%.1f%%';
```
阅读全文