在matlab中重塑矩阵
reshape matrix in matlab
我再也看不到错误了...也许(很可能 :-) )还有一种更简单、更快捷的方法来做到这一点...
我在一个小的 expData 中总结了我庞大的数据框架的重要列(见下文)。
这个问题其实很简单,只是我对解决它的简单想法视而不见..
我的 objective 是将列 b、c、d 重塑为一列,之后 expData 看起来像 expData2。
如果有人能帮助我,我会很高兴。
到目前为止我的代码:
a = [1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5]';
b = [0.3 0.3 0.3 0.3 0.3 0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 0.5 0.5 0.8 0.8 0.8 0.8 0.8 0.9 0.9 0.9 0.9 0.9]';
c = [0.4 0.4 0.4 0.4 0.4 0.6 0.6 0.6 0.6 0.6 0.8 0.8 0.8 0.8 0.8 0.9 0.9 0.9 0.9 0.9 0.1 0.1 0.1 0.1 0.1]';
d = [0.5 0.5 0.5 0.5 0.5 0.1 0.1 0.1 0.1 0.1 0.7 0.7 0.7 0.7 0.7 0.2 0.2 0.2 0.2 0.2 0.3 0.3 0.3 0.3 0.3]';
e = rand(25,1);
f = rand(25,1);
a2 = [2 3 4 2 3 4 2 3 4 2 3 4 2 3 4]';
b2 = [0.3 0.4 0.5 0.4 0.6 0.1 0.5 0.8 0.7 0.8 0.9 0.2 0.9 0.1 0.3]';
c2 = rand(15,1);
d2 = rand(15,1);
expData = horzcat(a,b,c,d,e,f);
expData2 = horzcat(a2,b2,c2,d2); % for explanation of my objective
k = horzcat(expData(:,2),expData(:,3),expData(:,4))'; % How I wanted to do it
expData(:,2:4) = [];
k = reshape(k,[],1);
for index = 1:size(expData,1)
if expData(index,1) == 1
expData(index,:) = [];
end
if expData(index,1) == 5
expData(index,:) = [];
end
end
k = k(1:size(expData,1),:);
expData2 = [expData k];
您当前的代码会引发错误,因为循环迭代的次数是在循环开始时确定的。当您删除 expData
的行时,您 运行 行在某个时间点索引。
快速解决方法是从后面开始循环,即使用 for index = size(expData,1):-1:1
。这样,您就可以安全地删除行,而不会 运行 陷入索引问题。
优雅的修复方法是使用 ismember
来识别要删除的行:
rows2remove = ismember(expData(:,1),[1 5]);
expDate(rows2remove,:) = [];
我再也看不到错误了...也许(很可能 :-) )还有一种更简单、更快捷的方法来做到这一点... 我在一个小的 expData 中总结了我庞大的数据框架的重要列(见下文)。
这个问题其实很简单,只是我对解决它的简单想法视而不见..
我的 objective 是将列 b、c、d 重塑为一列,之后 expData 看起来像 expData2。
如果有人能帮助我,我会很高兴。
到目前为止我的代码:
a = [1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5]';
b = [0.3 0.3 0.3 0.3 0.3 0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 0.5 0.5 0.8 0.8 0.8 0.8 0.8 0.9 0.9 0.9 0.9 0.9]';
c = [0.4 0.4 0.4 0.4 0.4 0.6 0.6 0.6 0.6 0.6 0.8 0.8 0.8 0.8 0.8 0.9 0.9 0.9 0.9 0.9 0.1 0.1 0.1 0.1 0.1]';
d = [0.5 0.5 0.5 0.5 0.5 0.1 0.1 0.1 0.1 0.1 0.7 0.7 0.7 0.7 0.7 0.2 0.2 0.2 0.2 0.2 0.3 0.3 0.3 0.3 0.3]';
e = rand(25,1);
f = rand(25,1);
a2 = [2 3 4 2 3 4 2 3 4 2 3 4 2 3 4]';
b2 = [0.3 0.4 0.5 0.4 0.6 0.1 0.5 0.8 0.7 0.8 0.9 0.2 0.9 0.1 0.3]';
c2 = rand(15,1);
d2 = rand(15,1);
expData = horzcat(a,b,c,d,e,f);
expData2 = horzcat(a2,b2,c2,d2); % for explanation of my objective
k = horzcat(expData(:,2),expData(:,3),expData(:,4))'; % How I wanted to do it
expData(:,2:4) = [];
k = reshape(k,[],1);
for index = 1:size(expData,1)
if expData(index,1) == 1
expData(index,:) = [];
end
if expData(index,1) == 5
expData(index,:) = [];
end
end
k = k(1:size(expData,1),:);
expData2 = [expData k];
您当前的代码会引发错误,因为循环迭代的次数是在循环开始时确定的。当您删除 expData
的行时,您 运行 行在某个时间点索引。
快速解决方法是从后面开始循环,即使用 for index = size(expData,1):-1:1
。这样,您就可以安全地删除行,而不会 运行 陷入索引问题。
优雅的修复方法是使用 ismember
来识别要删除的行:
rows2remove = ismember(expData(:,1),[1 5]);
expDate(rows2remove,:) = [];