我有两个(或更多,但如果解决了两个,它解决了任何数字)2×N矩阵,表示带有x(第一行)和y(第二行)坐标的点。这些点始终按递增的x坐标排序。我想要做的是我想将这两个矩阵合并为一个3乘N矩阵,这样如果两个点(每个矩阵一个)具有相同的x坐标,它们将在新矩阵中形成一列,第一个row是x坐标,第二和第三行是两个y坐标。但是,如果一个矩阵中的某个点的x坐标与第二个矩阵中的所有其他点不同,我仍然希望放置完整的3个元素列,使得x坐标仍然排序,并且缺少的值来自另一个矩阵被最近的值替换为较低的x坐标(如果没有则为NaN)。
最好通过例子来解释。
第一个矩阵:
kmlLayer.addListener('click', function(event) {
toggleKml(map); //change kml file
setTimeout(function(){
map.setZoom(10);
var text = event.featureData.name;
var latitude = event.latLng.lat();
var longitude = event.latLng.lng();
console.log( latitude + ', ' + longitude );
var point = new google.maps.LatLng(latitude, longitude);
map.setCenter(point);
}, 2000);
});
第二个矩阵:
1 3 5 7 % x coordinate
1 2 3 4 % y coordinate
期望的结果:
2 3 4 7 8 % x coordinate
5 6 7 8 9 % y coordinate
我的问题是,我怎么能在matlab / octave和numpy中有效呢? (实际上,因为我总能做到这一点"手动"有循环,但这看起来并不正确。)
答案 0 :(得分:5)
您可以使用interp1
和关键字'previous'
来制定策略(如果您不关心它是否更大或更小,也可以选择'nearest'
)并{{1}允许外推。
定义矩阵
'extrap'
然后找到插值点
a=[...
1 3 5 7;...
1 2 3 4];
b=[...
2 3 4 7 8;...
5 6 7 8 9];
并插入
x = unique([a(1,:),b(1,:)]);
Timeit结果:
我在
上测试了算法[x ; interp1(a(1,:),a(2,:),x,'previous','extrap') ; interp1(b(1,:),b(2,:),x,'previous','extrap') ]
得到了:
答案 1 :(得分:2)
此版本使用set操作:
a=[...
1 3 5 7;...
1 2 3 4];
b=[...
2 3 4 7 8;...
5 6 7 8 9];
% compute union of x coordinates
c = union(a(1,:),b(1,:));
% find indices of x of a and b coordinates in c
[~,~,ia] = intersect(a(1,:),c);
[~,~,ib] = intersect(b(1,:),c);
% create output matrix
d = NaN(3,numel(c));
d(1,:) = c;
d(2,ia) = a(2,:);
d(3,ib) = b(2,:);
% fill NaNs
m = isnan(d);
m(:,1) = false;
i = find(m(:,[2:end,1])); %if you have multiple consecutive nans you have to repeat these two steps
d(m) = d(i);
disp(d);
答案 2 :(得分:1)
你的例子:
a = [1 3 5 7; 1 2 3 4];
b = [2 3 4 7 8; 5 6 7 8 9];
% Get the combined (unique, sorted) `x` coordinates
output(1,:) = unique([a(1,:), b(1,:)]);
% Initialise y values to NaN
output(2:3, :) = NaN;
% Add x coords from `a` and `b`
output(2, ismember(output(1,:),a(1,:))) = a(2,:);
output(3, ismember(output(1,:),b(1,:))) = b(2,:);
% Replace NaNs in columns `2:end` with the previous value.
% A simple loop has the advantage of capturing multiple consecutive NaNs.
for ii = 2:size(output,2)
colNaN = isnan(output(:, ii));
output(colNaN, ii) = output(colNaN, ii-1);
end
如果您有超过2个矩阵(如问题中所示),那么我建议
ismember
的调用,而不是每个矩阵的一个代码行是硬编码的。 这是适用于a
和b
的任意数量矩阵的通用解决方案:
mats = {a, b};
cmats = horzcat(mats);
output(1, :) = unique(cmats(1,:));
output(2:numel(mats)+1, :) = NaN;
for ii = 1:size(mats)
output(ii+1, ismember(output(1,:), mats{ii}(1,:))) = mats{ii}(2,:);
end
for ii = 2:size(output,2)
colNaN = isnan(output(:,ii));
output(colNaN, ii) = output(colNaN, ii-1);
end