选择矩阵满足条件的向量元素
Selecting elements of a vector for which a matrix satisfies a condition
我有两个元素数量相等的向量。它们被称为 x
和 y
,并且有 N
个元素。我想保留满足条件 S(x(i),y(i))>0.1
的向量的元素。
例如,如果 S(x_i , y_i)
小于 0.1
,我想从向量 x
和 [=14= 中删除 x_i
和 y_i
], 分别。 x_i
和 y_i
是向量的第 i
个元素的值。
我该怎么做?
示例:
x=[1,3,2,3];
y=[2,4,1,3];
在此示例中,代码应检查 S(1,2), S(3,4), S(2,1), S(3,3)
。
考虑 S
为
S=[1,3,4,5;
1,3,4,5;
1,2,0,0.001;
12,21,2,5]
那么向量的新值是:
xnew=[1,2];
ynew=[2,1];
你能做的就是制作一个“消元阵”。循环遍历所有x,y
对,检查S
中对应的条目,如果条件满足则将淘汰设置为true
。然后,在最后,删除所有应该删除的元素。
x=[1,3,2,3];
y=[2,4,1,3];
S=[1,3,4,5;1,3,4,5;1,2,0,0.001;12,21,2,5];
% Preallocate to no elimination taking place
eliminate = zeros(size(x),'logical');
for ii = 1:numel(x) % Loop over all elements
if S(x(ii),y(ii)) < 0.1 % If the condition holds
eliminate(ii) = true; % Set elimination to true
end
end
% Remove elements to be eliminated
x(eliminate) = []
y(eliminate) = []
x =
1 2
y =
2 1
一个one-liner做这个更优雅一点
eliminate = diag(S(x,y))<0.1;
x(eliminate) = []
y(eliminate) = []
S(x,y)
创建一个矩阵,其中 x
和 y
被认为是可置换的,即在本例中它将是 4x4。我们只需要您提供的对,它们将位于该矩阵的对角线上;使用 diag()
来获得这些。然后,使用 <0.1
进行逻辑检查,最后使用与上述相同的删除技巧。
您可以按照以下方式进行:
- 构建一个 linear index 从
x
和 y
到 select S
. 的所需条目
- 将这些条目与阈值进行比较。这给出了一个 logical index ,您可以将其用于
x
和 y
:
x = [1,3,2,3];
y = [2,4,1,3];
S = [1,3,4,5; 1,3,4,5; 1,2,0,0.001; 12,21,2,5];
linear_ind = x + (y-1)*size(S,1);
logical_ind = S(linear_ind)>0.1;
x_new = x(logical_ind);
y_new = y(logical_ind);
我有两个元素数量相等的向量。它们被称为 x
和 y
,并且有 N
个元素。我想保留满足条件 S(x(i),y(i))>0.1
的向量的元素。
例如,如果 S(x_i , y_i)
小于 0.1
,我想从向量 x
和 [=14= 中删除 x_i
和 y_i
], 分别。 x_i
和 y_i
是向量的第 i
个元素的值。
我该怎么做?
示例:
x=[1,3,2,3];
y=[2,4,1,3];
在此示例中,代码应检查 S(1,2), S(3,4), S(2,1), S(3,3)
。
考虑 S
为
S=[1,3,4,5;
1,3,4,5;
1,2,0,0.001;
12,21,2,5]
那么向量的新值是:
xnew=[1,2];
ynew=[2,1];
你能做的就是制作一个“消元阵”。循环遍历所有x,y
对,检查S
中对应的条目,如果条件满足则将淘汰设置为true
。然后,在最后,删除所有应该删除的元素。
x=[1,3,2,3];
y=[2,4,1,3];
S=[1,3,4,5;1,3,4,5;1,2,0,0.001;12,21,2,5];
% Preallocate to no elimination taking place
eliminate = zeros(size(x),'logical');
for ii = 1:numel(x) % Loop over all elements
if S(x(ii),y(ii)) < 0.1 % If the condition holds
eliminate(ii) = true; % Set elimination to true
end
end
% Remove elements to be eliminated
x(eliminate) = []
y(eliminate) = []
x =
1 2
y =
2 1
一个one-liner做这个更优雅一点
eliminate = diag(S(x,y))<0.1;
x(eliminate) = []
y(eliminate) = []
S(x,y)
创建一个矩阵,其中 x
和 y
被认为是可置换的,即在本例中它将是 4x4。我们只需要您提供的对,它们将位于该矩阵的对角线上;使用 diag()
来获得这些。然后,使用 <0.1
进行逻辑检查,最后使用与上述相同的删除技巧。
您可以按照以下方式进行:
- 构建一个 linear index 从
x
和y
到 selectS
. 的所需条目
- 将这些条目与阈值进行比较。这给出了一个 logical index ,您可以将其用于
x
和y
:
x = [1,3,2,3];
y = [2,4,1,3];
S = [1,3,4,5; 1,3,4,5; 1,2,0,0.001; 12,21,2,5];
linear_ind = x + (y-1)*size(S,1);
logical_ind = S(linear_ind)>0.1;
x_new = x(logical_ind);
y_new = y(logical_ind);