% % 读取数据 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 = i*100; 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%%';这段代码有问题吗?可以画出每个格子内带有百分比的数值的混淆矩阵吗?
时间: 2023-07-16 19:12:56 浏览: 62
这段代码有一些问题:
1. `readmatrix`函数只在MATLAB R2019b及以上版本中可用,如果你使用的是更早的版本,需要使用`xlsread`或者`csvread`等函数读取Excel文件。
2. 在计算准确率时,for循环中的第一个部分和第二个部分有重复,应该只使用其中一个。建议使用第二个部分,因为它更简洁明了。
3. 在画混淆矩阵时,`confusionchart`函数需要安装MATLAB R2020a及以上版本才能使用。如果你使用的是更早的版本,可以使用`plotconfusion`函数代替。
如果你使用的是MATLAB R2020a及以上版本,那么这段代码可以正确地画出每个格子内带有百分比的数值的混淆矩阵。否则,你需要修改代码以适应你的版本和数据格式。
相关问题
% % 读取数据 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,如果不行,那应该怎么修改呢
这段代码有一些问题:
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%%';
```
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 画出混淆矩阵后怎么在每个格子内显示数值
可以使用 `text` 函数在每个格子内显示数值。以下是添加数值的代码:
```
% 绘制混淆矩阵
figure;
imagesc(confusionMat);
colorbar;
colormap(flipud(gray));
% 添加数值
textStrings = num2str(confusionMat(:),'%d');
textStrings = strtrim(cellstr(textStrings));
[x, y] = meshgrid(1:size(confusionMat,1), 1:size(confusionMat,2));
hStrings = text(x(:), y(:), textStrings(:), 'HorizontalAlignment', 'center');
midValue = mean(get(gca,'CLim'));
textColors = repmat(confusionMat(:) > midValue, 1, 3);
set(hStrings, {'Color'}, num2cell(textColors, 2));
```
这段代码会在混淆矩阵每个格子内显示对应的数值。