フィルターのクリア

Puzzler: Quickly tell if two absolute indices (a,b) are four connected for n x m matrix.

1 回表示 (過去 30 日間)
function flag = isFourConnected(a,b,n,m)
%
% a,b: indices of interest a ~= b
% n,m: size of matrix of interest
%
% flag: True if indices a and b are four connected
% in a matrix of size n x m
%
%
% Your code here
Note, this code should use no toolboxes, and should be reasonably quick as this function will be called many times. Reasonably quick is up to debate as the rest of the code forms.
  10 件のコメント
Fangjun Jiang
Fangjun Jiang 2011 年 9 月 2 日
@andrei, your code above returns false for both (1,4,4,5) and (1,17,4,5)
Walter Roberson
Walter Roberson 2011 年 9 月 2 日
Did anyone run timing tests on the survivors?

サインインしてコメントする。

採用された回答

David Young
David Young 2011 年 9 月 1 日
function flag = isFourConnected(a,b,n,m)
%
% a,b: indices of interest a ~= b
% n,m: size of matrix of interest
%
% flag: True if indices a and b are four connected
% in a matrix of size n x m
%
d = abs(a-b);
flag = d == n || (d == 1 && mod(min(a,b), n));
end
  3 件のコメント
Andrei Bobrov
Andrei Bobrov 2011 年 9 月 2 日
Hi David! +1
David Young
David Young 2011 年 9 月 3 日
Thanks Doug!

サインインしてコメントする。

その他の回答 (5 件)

Fangjun Jiang
Fangjun Jiang 2011 年 9 月 1 日
Circle-shifting neighbors are considered connected.
function flag = isFourConnected(a,b,n,m)
%
% a,b: indices of interest a ~= b
% n,m: size of matrix of interest
%
% flag: True if indices a and b are four connected
% in a matrix of size n x m
%
%
% Your code here
[x,y]=ind2sub([n,m],[a;b]);
xdiff=abs(x(1)-x(2));
ydiff=abs(y(1)-y(2));
flag = ((xdiff==0) && (ydiff==1) || (ydiff==m-1)) || ...
((ydiff==0) && (xdiff==1) || (xdiff==n-1));
A little test script. All other entries so far didn't pass this test.
clc;
TestVector={6,7,4,5
6,10,4,5
1,4,4,5
1,17,4,5};
for k=1:size(TestVector,1)
if isFourConnected(TestVector{k,:})~=true
disp(k);beep;
end
end
  1 件のコメント
Doug Hull
Doug Hull 2011 年 9 月 1 日
clever, I like it! First in also! Thanks (will accept after a few hours to let more people at it!)

サインインしてコメントする。


Walter Roberson
Walter Roberson 2011 年 9 月 1 日
function flag = isFourConnected(a,b,n,m)
%
% a,b: indices of interest a ~= b
% n,m: size of matrix of interest
%
% flag: True if indices a and b are four connected
% in a matrix of size n x m
%
%
flag = abs(a-b)==n || (floor(a/n)==floor(b/n) && abs(a-b)==1);
  3 件のコメント
Walter Roberson
Walter Roberson 2011 年 9 月 1 日
flag = abs(a-b)==n || (abs(a-b)==1 && floor(a/n)==floor(b/n));

サインインしてコメントする。


Oleg Komarov
Oleg Komarov 2011 年 9 月 1 日
I assume a,b,m,n always numeric and integer values > 1
function flag = isFourConnected(a,b,n,m)
% a,b : indices of interest a ~= b
% m,n : size of matrix of interest
% flag: True if indices a and b are four connected
% in a matrix of size n x m
d = a-b; flag = d == n || d == -n || (d == 1 && mod(a,n) ~= 1) || (d == -1 && mod(b,n) ~= 1);
  4 件のコメント
Oleg Komarov
Oleg Komarov 2011 年 9 月 1 日
Can't find any other valid solution to ensure bottom vs top not 4 conn except the ones already proposed.
Walter Roberson
Walter Roberson 2011 年 9 月 1 日
Tossing something together: diff(mod(sort([a,b]),n))<0

サインインしてコメントする。


Bruno Luong
Bruno Luong 2011 年 9 月 1 日
function flag = isFourConnected(a,b,n,m)
% 10 arithmetic operations by pair
c = max(a,b);
d = min(a,b);
e = c - d;
flag = (e==1 & mod(d,n)) | (e==n & c>n);
  2 件のコメント
Walter Roberson
Walter Roberson 2011 年 9 月 1 日
This might or might not be slightly faster:
c = sort([a,b]);
e = c(2)-c(1);
flag = (e==1 & mod(c(1),n)) | (e==m & c(2)>n);
Or if you prefer your original structure, then instead of max/min, you could use
c = max(a,b);
d = a + b - c;
Bruno Luong
Bruno Luong 2011 年 9 月 1 日
I believe I had one redundant test in the earlier code:
function flag = isFourConnected(a,b,n,m)
% 8 arithmetic operations by pair
c = max(a,b);
d = min(a,b);
e = c - d;
flag = (e==1 & mod(d,n)) | (e==n);

サインインしてコメントする。


Daniel Shub
Daniel Shub 2011 年 9 月 2 日
I am not sure what to do about circle-shifting neighbors so I have two answers.
function flag = isFourConnected(a,b,n,m)
%
% a,b: indices of interest a ~= b
% n,m: size of matrix of interest
%
% flag: True if indices a and b are four connected
% in a matrix of size n x m
%
%
% Your code here
% Using ind2sub might be faster.
col = mod([a(:), b(:)]-1, n)+1;
row = ceil([a(:), b(:)]/n);
%[col, row] = ind2sub([n, m], [a(:), b(:)]);
flag = reshape(mod(abs(diff(col, 1, 2)), n-2)+mod(abs(diff(row, 1, 2)), m-2) == 1, size(a));
% if circle shifted points are not connected:
% flag = reshape(abs(diff(col, 1, 2))+abs(diff(row, 1, 2)) == 1, size(a));

カテゴリ

Help Center および File ExchangeMathematics についてさらに検索

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by