You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MATLAB中为含NaN的2D矩阵绘制归一化频率分布图?

解决含NaN的2D矩阵归一化与频率分布图绘制问题

我来帮你梳理下问题:你的原始代码因为没考虑NaN值,导致原本的NaN网格被错误计算出数值,下面是修正后的归一化方案,以及两种绘制频率分布图的方法。

一、正确的归一化(保留NaN)

你的核心问题是min(A)和max(A)默认会忽略NaN,但后续运算把原NaN的位置也参与了计算,所以我们需要明确忽略NaN来计算有效数据的极值,同时让原NaN位置保持NaN。

全局归一化(整个矩阵的有效数据归一到[0,1])

A = per_monsoon_postmon; % 你的80×80矩阵
% 计算全局有效极值(忽略NaN)
min_val = min(A(:), [], 'omitNaN');
max_val = max(A(:), [], 'omitNaN');
% 元素级归一化,自动保留NaN
normalizedA = (A - min_val) ./ (max_val - min_val);

如果需要按列/按行单独归一化,只需要调整维度参数:

% 按列归一化
min_val = min(A, [], 1, 'omitNaN'); % 1表示按列取最小值
max_val = max(A, [], 1, 'omitNaN');
normalizedA = (A - min_val) ./ (max_val - min_val);

% 按行归一化
min_val = min(A, [], 2, 'omitNaN'); % 2表示按行取最小值
max_val = max(A, [], 2, 'omitNaN');
normalizedA = (A - min_val) ./ (max_val - min_val);

二、绘制归一化频率分布图

根据你的需求,分两种场景给出方法:

1. 可视化归一化矩阵的数值分布(热力图)

如果想直观展示每个网格的归一化值分布,用heatmap或imagesc最直接:

% 方法1:heatmap(自带标签,更易用)
figure;
heatmap(normalizedA, 'ColorbarLabel', '归一化值');
title('80×80矩阵归一化值分布热力图');

% 方法2:imagesc(更灵活,适合自定义坐标轴)
figure;
imagesc(normalizedA);
colorbar;
axis equal tight;
title('归一化矩阵数值分布');
xlabel('列索引');
ylabel('行索引');

2. 统计归一化值的频率分布(直方图/密度曲线)

如果想统计归一化后数值的出现频次或密度,用histogram或ksdensity:

% 先提取有效数值(去掉NaN)
valid_vals = normalizedA(~isnan(normalizedA));

% 方法1:一维频率直方图(可直接归一化为概率)
figure;
histogram(valid_vals, 20, 'Normalization', 'probability'); % 20为分箱数,probability表示归一到概率总和为1
title('归一化值的频率分布(概率)');
xlabel('归一化值');
ylabel('概率');

% 方法2:核密度估计曲线(平滑的连续分布)
[f, x] = ksdensity(valid_vals);
figure;
plot(x, f);
title('归一化值的核密度分布');
xlabel('归一化值');
ylabel('密度');

三、直接绘制频率分布的快捷方法

如果你不需要先得到归一化矩阵,想直接基于原始矩阵的有效数值绘制归一化后的频率分布,可以一步到位:

valid_vals = A(~isnan(A));
figure;
histogram(valid_vals, 'Normalization', 'pdf'); % pdf表示概率密度,也可选'probability'等
title('原始数值的归一化频率分布(概率密度)');
xlabel('原始数值');
ylabel('概率密度');

内容的提问来源于stack exchange,提问作者Da vinci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:39:04