Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays MATLAB:在匹配多维条件的数组中搜索元素_Arrays_Matlab_Conditional Statements - Fatal编程技术网

Arrays MATLAB:在匹配多维条件的数组中搜索元素

Arrays MATLAB:在匹配多维条件的数组中搜索元素,arrays,matlab,conditional-statements,Arrays,Matlab,Conditional Statements,我有一个实数的列向量(V1),如: 123.2100 125.1290 ... 954.2190 如果我在向量中的每一行加上一个数字1,我将得到(V2): 我需要找出V2中有多少元素在从V1创建的某个错误窗口中。例如,错误窗口=0.1(但在我的例子中,V1中的每个元素都有自己的错误窗口): 我可以创建如下代码: % x - my vector % ppm - a variable responsible for error-window window = [(1-(ppm/1000000))*

我有一个实数的列向量(V1),如:

123.2100
125.1290
...
954.2190
如果我在向量中的每一行加上一个数字1,我将得到(V2):


我需要找出V2中有多少元素在从V1创建的某个错误窗口中。例如,错误窗口=0.1(但在我的例子中,V1中的每个元素都有自己的错误窗口):

我可以创建如下代码:

% x - my vector
% ppm - a variable responsible for error-window
window = [(1-(ppm/1000000))*x, (1+(ppm/1000000))*x]; % - error-window
mdiff = 1:0.001:20; % the numbers I will iteratively add to x 
                    % (like the number 1 in the example)
cdiff = zeros(length(mdiff),1); % a vector that will contain counts of elements
                                % corresponding to different mdiff temp = 0;

for i = 1:length(mdiff)
    for j = 1:size(window,1)
        xx = x + mdiff(i);
        indxx = find( xx => window(j,1) & xx <= window(j,2) );
        if any(indxx)
            temp = temp + length(indxx); %edited
        end
    end
    cdiff(i) = temp;
    temp = 0;
end

在这种情况下,代码运行得更快,而且似乎正常

您认为这可能适合您吗-

%%// Input data
V1 = 52+rand(4,1)

V2 = V1+1;
t= 0.1;

low_bd = any(abs(bsxfun(@minus,V2,[V1-t]'))<t,2); %%//'
up_bd = any(abs(bsxfun(@minus,V2,[V1+t]'))<t,2); %%//'
count = nnz( low_bd | up_bd )
add=1;%//要加多少
错误=.1;%//最大允许误差
V2=V1+add;%//构建V2
ind=sum(abs(bsxfun(@减号,V1(:).),V2(:))1;%')//元素索引
%//满足最大错误条件的V1的值。“>1”用于
%//元素至少等于其自身
计数=nnz(ind);

我相信您可以使用类似二进制搜索的方法来避免进行所有n²迭代。首先对V1进行排序,然后对每个V2与V1的中间项进行比较,看看它是高于还是低于V1。如果它低于V1,则无需检查V1的上半部分。然后继续,直到找到匹配项,或者直到候选项用尽为止我的小评论:你不需要使用
find
,你可以直接做
(xx=…)
。接下来,在第二个for循环之前移动
xx=…
,因为它不会随着
j
的函数而改变。你更大的问题是你的算法需要
O(n*m^2)
时间,其中
n=length(mdiff)
m=length(x)
@BasSwinckels感谢您的帮助comment@Kirill确保编辑代码生成与原始代码相匹配的值。@Divakar,是的,它会生成。在原始版本中,我唯一需要更改的是不要使用
temp=temp+1
,而是
temp=temp+length(indxx)
。感谢您的帮助!为了检查是否在该窗口中,您不应该也检查
V1-add
的情况吗?我要做的是检查abs(V1-V2)是否@LuisMendo V1中的每个元素都有自己的错误项。在这种情况下,t的维度将与V1相同。在这种情况下,我想检查V2中的某些元素是否落在从V1创建的任何窗口内。在我的情况下,错误项“t”作为V1中值的函数发生变化:window=[(1-(ppm/1000000))*x,(1+(ppm/1000000))*x]@Kirill那么我可以假设
t
的长度与
V1
相同吗?V1中的每个元素都有自己的错误范围:window=[(1-(ppm/1000000))*x,(1+(ppm/1000000))*x].在本例中,我显示了错误窗口。如果这些窗口中出现了问题,我必须对其进行计数。Divakar,是的,没错。很抱歉,我的错误窗口中没有具体说明question@Kirill签出编辑1。
% x - my vector
% ppm - a variable responsible for error-window
window = [(1-(ppm/1000000))*x, (1+(ppm/1000000))*x]; % - error-window
mdiff = 1:0.001:20; % the numbers I will iteratively add to x 
                    % (like the number 1 in the example)
cdiff = zeros(length(mdiff),1); % a vector that will contain counts of elements
                                % corresponding to different mdiff temp = 0;

for i = 1:length(mdiff)
    for j = 1:size(window,1)
        xx = x + mdiff(i);
        indxx = find( xx => window(j,1) & xx <= window(j,2) );
        if any(indxx)
            temp = temp + length(indxx); %edited
        end
    end
    cdiff(i) = temp;
    temp = 0;
end
% x - my vector
% ppm - a variable responsible for error-window
window = [(1-(ppm/1000000))*x, (1+(ppm/1000000))*x]; % - error-window
mdiff = 1:0.001:20; % the numbers I will iteratively add to x 
                    % (like the number 1 in the example)
cdiff = zeros(length(mdiff),1); % a vector that will contain counts of elements
                                % corresponding to different mdiff temp = 0;

for i = 1:length(mdiff)
    xx = x + mdiff(i);
    cdiff(i) = sum(sum(bsxfun(@and,bsxfun(@ge,xx,window(:,1)'),bsxfun(@le,xx,window(:,2)'))));
end
%%// Input data
V1 = 52+rand(4,1)

V2 = V1+1;
t= 0.1;

low_bd = any(abs(bsxfun(@minus,V2,[V1-t]'))<t,2); %%//'
up_bd = any(abs(bsxfun(@minus,V2,[V1+t]'))<t,2); %%//'
count = nnz( low_bd | up_bd )
diff_map = abs(bsxfun(@minus,[V1-t V1+t],permute(V2,[3 2 1])));
count = nnz(any(any(diff_map<t,2),1))
low_bd = any(abs(bsxfun(@minus,V2,window(:,1)'))<t,2); %%//'
up_bd = any(abs(bsxfun(@minus,V2,window(:,2)'))<t,2); %%//'
count = nnz( low_bd | up_bd )
t1 = bsxfun(@plus,x,mdiff);
d1 = bsxfun(@ge,t1,permute(window(:,1),[3 2 1]));
d2 = bsxfun(@le,t1,permute(window(:,2),[3 2 1]));
t2 = d1.*d2;
cdiff_vect = max(sum(t2,3),[],1)';
add = 1; %// how much to add
error = .1; %// maximum allowed error

V2 = V1 + add; %// build V2   
ind = sum(abs(bsxfun(@minus, V1(:).', V2(:)))<error)>1; %'// index of elements
%// of V1 satisfying the maximum error condition. ">1" is used to because each 
%// element is at least equal to itself
count = nnz(ind);