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 画出混淆矩阵后怎么在每个格子内显示数值
时间: 2023-07-16 12:12:51 浏览: 51
可以使用 `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));
```
这段代码会在混淆矩阵每个格子内显示对应的数值。
相关问题
% % 读取数据 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%%';
```
生成2FSK调制信号变为.wav文件格式
要将生成的2FSK调制信号保存为.wav文件格式,你可以使用MATLAB中的`audiowrite`函数。
以下是修改后的代码示例:
```matlab
% 设置参数
fs = 44100; % 采样频率
bitrate = 100; % 比特率
frequency_1 = 1000; % 第一种频率
frequency_2 = 2000; % 第二种频率
amplitude = 1; % 调制信号幅度
bits = [0 1 0 1]; % 要传输的比特串
% 生成时间轴
t = 0:1/fs:((length(bits)*bitrate)-1)/fs;
% 生成调制信号
signal = zeros(1, length(t));
for i = 1:length(bits)
if bits(i) == 1
signal((i-1)*bitrate*fs+1:i*bitrate*fs) = amplitude * cos(2*pi*frequency_2*t((i-1)*bitrate*fs+1:i*bitrate*fs));
else
signal((i-1)*bitrate*fs+1:i*bitrate*fs) = amplitude * cos(2*pi*frequency_1*t((i-1)*bitrate*fs+1:i*bitrate*fs));
end
end
% 将信号归一化到[-1, 1]范围
signal = signal / max(abs(signal));
% 将信号保存为.wav文件
filename = '2FSK_modulated_signal.wav';
audiowrite(filename, signal, fs);
disp('2FSK调制信号已保存为.wav文件。');
```
在这个例子中,我们使用了更高的采样频率(fs = 44100)以提高音频质量。调用`audiowrite`函数来保存信号到.wav文件中。你可以根据需要修改参数和比特串,运行代码后将会保存2FSK调制信号为.wav文件,并在控制台打印相关信息。请确保你有适当的读写权限来保存文件。