当前位置: 首页 > 知识库问答 >
问题:

用nan值在matlab中重新格式化矩阵

易修洁
2023-03-14

这一员额是根据前一个关于矩阵结构调整的问题:

在matlab中重新格式化矩阵

我面临的另一个问题由以下示例演示:

depth = [0:1:20]';
data = rand(1,length(depth))';
d = [depth,data];
d = [d;d(1:20,:);d];

在这里,我想改变这个矩阵,以便每一列代表一个特定的深度,每一行代表时间,所以最终我会有3行(即天)和21列(即在每个深度测量)。然而,我们不能重塑这一点,因为给定一天的测量数量不相同,即有些丢失。这是已知的:

dd = sortrows(d,1);
for i = 1:length(depth);
    e(i) = length(dd(dd(:,1)==depth(i),:));
end

从“e”中,我们发现不同的天数,深度的数量是不同的。如何在矩阵中插入nan,以便每天都具有相同的深度值?我可以首先通过以下方法找到独特的深度:

唯一性(d(:,1)),因此,如果给定日期缺少深度(来自唯一性),我希望将深度插入正确位置,并将nan插入数据列中的相应位置。如何做到这一点?

共有2个答案

帅德惠
2023-03-14

从你的问题中还不完全清楚你的数据到底是什么样子,但是下面的内容可能会帮助你找到答案。

假设你有一个列向量

day1=1:21'

并且,最初,所有值都是NaN

day 1(:)=NaN

假设接下来有一个二维测量数组,其中第一列表示深度,第二列表示这些深度的测量值。例如

msrmnts=[1,2; 2,3; 4,5; 6,7]%etc

然后是作业

day 1(msrmnts(:,1))=msrmnts(:,2)

将仅在索引位于msrmnts第一列的day1行中设置值。例如,第二条语句使用Matlab的功能,将一个数组用作另一个数组的索引集

d([978124])=1:5

d[9 7 8 12 4]元素设置为1:5。请注意,元素的索引不需要按顺序排列。您甚至可以在索引数组中多次插入相同的值,例如[4 4 5 6 3 4],尽管它不是非常有用。

华宏逸
2023-03-14

您正确地认为,unique可能在这里派上用场。您还需要第三个输出参数,它将唯一深度映射到原始d向量中的位置。看看这个代码-注释解释了我的工作

% find unique depths and their mapping onto the d array
[depths, ~, j] = unique(d(:,1));

% find the start of every day of measurements
% the assumption here is that the depths for each day are in increasing order 
days_data = [1; diff(d(:,1))<0];

% count the number of days
ndays = sum(days_data);

% map every entry in d to the correct day
days_data = cumsum(days_data);

% construct the output array full of nans
dd = nan(numel(depths), ndays);

% assing the existing measurements using linear indices
% Where data does not exist, NaN will remain
dd(sub2ind(size(dd), j, days_data)) = d(:,2)

dd =

0.5115    0.5115    0.5115
0.8194    0.8194    0.8194
0.5803    0.5803    0.5803
0.9404    0.9404    0.9404
0.3269    0.3269    0.3269
0.8546    0.8546    0.8546
0.7854    0.7854    0.7854
0.8086    0.8086    0.8086
0.5485    0.5485    0.5485
0.0663    0.0663    0.0663
0.8422    0.8422    0.8422
0.7958    0.7958    0.7958
0.1347    0.1347    0.1347
0.8326    0.8326    0.8326
0.3549    0.3549    0.3549
0.9585    0.9585    0.9585
0.1125    0.1125    0.1125
0.8541    0.8541    0.8541
0.9872    0.9872    0.9872
0.2892    0.2892    0.2892
0.4692       NaN    0.4692

您可能需要转置矩阵。

 类似资料:
  • 问题内容: 我正在从数据库中提取各种帖子的日期。日期采用以下格式: 如何将这些日期重新格式化为更用户友好的格式: 假设从mysql数据库获取的日期存储在名为: 问题答案:

  • 我正在使用SQL Loader加载Oracle表,并且我对日期格式有问题。包含数据的CSV文件包含格式为YYYY-MM-DD HH:MM:SS的字符串,但Oracle表要求日期格式为DD-MON-YY。 我目前正在逐行查看CSV文件,以查找并重新格式化加载前的任何日期,但文件可以达到1000万行,这可能是一个非常缓慢的过程。SQL Loader是否允许在加载中重新格式化日期? 我在找像这样的东西

  • 主要内容:引用矩阵中的元素,删除矩阵中的一行或一列,矩阵运算,以下是纠正/补充内容:矩阵是数字的二维数组。 在MATLAB中,可以通过在每行中输入元素来创建一个矩形,以逗号或空格分隔数字,并使用分号标记每一行的结尾。 例如,创建一个矩阵 - MATLAB将执行上述语句并返回以下结果 - 引用矩阵中的元素 要引用矩阵的第行和第列中的元素,可以这样书写 - 例如,要引用矩阵的第行和第列中的元素,如上一节所述,可以这样书写 - MATLAB执行上述语句并返回以下结果 - 要引用第列中的

  • 问题内容: 我正在尝试编写一条指令,该指令会自动在中格式化数字,但模型未格式化。使它正常工作是很好的,在加载时,输入值在控制器中显示为1,000,000和1000000,但是,只有键入时,该函数才会触发。发生火灾的唯一时间是指令被加载且值为0时。 我怎样才能使它在keypress上起作用(我曾尝试绑定到keypress / keyup,但它不起作用)。 这是我的代码: 问题答案: 这是我们使用的工

  • 我执行了添加checkstyle的步骤 null

  • 问题内容: 我从插件收到日期时间。我把它放到一个变量中: 实际上就是 。 我需要将其显示给用户作为交易时间,但是看起来不合适。 我想把它安排成 或* 。 * 我该如何改变字符串的顺序? 至于现在,我可能认为是使用 substr 分隔日期和时间。我仍然不确定如何添加其他字符并重新安排日期。 问题答案: 为什么 不像下面那样使用 date() ,请尝试 并将被输出