错误使用 .* 矩阵维度必须一致。 出错 Untitled (第 29 行) noises = randn(1, N/2) .* sigma;
时间: 2023-12-14 18:40:12 浏览: 122
这个错误通常是因为使用 .* 运算符时,所涉及到的两个矩阵的维度不一致导致的。请检查下面代码中涉及到的矩阵的维度是否正确:
```matlab
noises = randn(1, N/2) .* sigma;
```
其中,randn(1, N/2) 生成的是一个1行、N/2列的随机矩阵,sigma 是一个标量或大小为1xN/2的向量。请确保这两个矩阵的维度一致,如果不一致需要进行相应的调整,使其能够进行 .* 运算。
相关问题
clear all; %% 参数设置 M = 4; % 调制阶数 N = 1e5; % 仿真比特数 SNRdB = 0:1:14; % 信噪比范围 Es = 1; % 符号能量 Eb = Es / log2(M); % 比特能量 sigma = sqrt(Es ./ (2 * 10 .^ (SNRdB/10))); % 噪声标准差 %% 信源产生信息比特 bits = randi([0, 1], 1, N); %% 调制 symbols = zeros(1, N/2); for i = 1:N/2 if bits(2i-1)==0 && bits(2i)==0 symbols(i) = -3; elseif bits(2i-1)==0 && bits(2i)==1 symbols(i) = -1; elseif bits(2i-1)==1 && bits(2i)==0 symbols(i) = 1; elseif bits(2i-1)==1 && bits(2i)==1 symbols(i) = 3; end end %% 信道 noises = randn(1, N/2) .* sigma; received = symbols + noises; %% 接收端检测 LLR = zeros(1, N); for i = 1:N/2 LLR(2i-1) = received(i) / sigma(find(SNRdB==SNRdB(i))); LLR(2i) = LLR(2i-1); end %% 将检测结果与信源原始信息比较计算误符号率和误比特率 BER = zeros(size(SNRdB)); SER = zeros(size(SNRdB)); for i = 1:length(SNRdB) % 接收端检测 noises = randn(1, N/2) . sigma(i); received = symbols + noises; LLR = zeros(1, N); for j = 1:N/2 LLR(2j-1) = received(j) / sigma(i); LLR(2j) = LLR(2j-1); end % 软判决译码 bits_hat = zeros(1, N); for j=1:N/2 if LLR(2j-1)>0 bits_hat(2j-1) = 1; end if LLR(2j)>0 bits_hat(2j) = 1; end end % 统计误码率 BER(i) = sum(bits~=bits_hat) / N; SER(i) = sum(symbols~=received) / (N/2); end %% 作图 semilogy(SNRdB, SER, 'k-o', 'linewidth', 2); hold on; semilogy(SNRdB, qfunc(sqrt(210.^(SNRdB/10))), 'r', 'linewidth', 2); grid on; xlabel('SNR(dB)'); ylabel('Symbol Error Rate'); legend('Simulation', 'Theory'); 这个程序出现了错误使用 .* 矩阵维度必须一致。 出错 Untitled (第 29 行) noises = randn(1, N/2) .* sigma; 错误,请更改形成新的MATLAB程序
根据错误提示,矩阵维度必须一致,说明 `sigma` 的维度与 `randn(1, N/2)`同。可以使用 `repmat` 函数将 `sigma` 扩展到与 `randn(1, N/2)` 维度相同的矩阵,如下所示:
```
noises = randn(1, N/2) .* repmat(sigma', 1, N/2);
```
将该代码替换原来的 `noises` 行即可。
矩阵维度必须一致。 出错 Untitled5>QPSK_BER (line 39) y = y + sigma * (randn(1,L+k-1) + 1j*randn(1,L+k-1))/sqrt(2); 出错 Untitled5 (line 10) BER(i) = QPSK_BER(N, EbN0dB(i));
这个错误通常是由于矩阵维度不一致导致的。根据您提供的错误信息,这个错误可能是由于信道输出y和加入的噪声sigma矩阵维度不一致导致的。
在程序中,信道输出y的长度应该是L+k-1,而加入的噪声sigma的长度应该是L+k-1或L+k。如果两者长度不一致,就会导致矩阵加法出现维度不一致的错误。
您可以尝试将代码中的randn(1,L+k-1)和randn(1,L+k-1)改为randn(L+k-1,1)和randn(L+k-1,1),这样生成的噪声矩阵长度就为L+k-1,与信道输出y的长度一致。修改后的代码如下:
```matlab
%% QPSK误码率曲线绘制程序示例
% 清空工作区和命令窗口
clc; clear;
% 定义QPSK调制解调程序,得到误码率数据
N = 10^6; % 发送比特数
EbN0dB = 0:2:12; % 信噪比范围
BER = zeros(size(EbN0dB)); % 初始化误码率数组
for i = 1:length(EbN0dB)
% 调用QPSK调制解调程序,计算误码率
BER(i) = QPSK_BER(N, EbN0dB(i));
end
% 绘制误码率曲线
figure;
semilogy(EbN0dB, BER, '-o');
xlabel('Eb/N0(dB)');
ylabel('BER');
title('QPSK系统误码率曲线');
% QPSK调制解调函数示例
function BER = QPSK_BER(N, EbN0dB)
% 参数设置
M = 4; % QPSK调制阶数
k = log2(M); % 每个符号的比特数
Es = 1; % 符号能量
Eb = Es / k; % 每个比特的能量
L = 2; % 信道长度
h = (randn(1,L)+1j*randn(1,L))/sqrt(2); % 随机信道
sigma = sqrt(Es / (2*k*10^(EbN0dB/10))); % 噪声方差
errors = 0; % 统计误码数
% 循环发送和接收N个比特
for i = 1:N/k
% 随机生成一个QPSK符号
data = randi([0,M-1],1,1);
x = qammod(data, M, 'gray');
% 使用信道模型发送信号
y = conv(x, h);
% 加入高斯白噪声
y = y + sigma * (randn(L+k-1,1) + 1j*randn(L+k-1,1))/sqrt(2);
% QPSK解调
r = qamdemod(y(k/2+1:end-k/2), M, 'gray');
% 计算误码率
errors = errors + sum(r~=data);
end
BER = errors / N; % 计算误码率
end
```
这个修改后的程序中,randn(1,L+k-1)和randn(1,L+k-1)被修改为randn(L+k-1,1)和randn(L+k-1,1),确保生成的噪声矩阵长度与信道输出y的长度一致。
阅读全文