필터 지우기
필터 지우기

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)

댓글을 달려면 로그인하십시오.

채택된 답변

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

댓글을 달려면 로그인하십시오.

추가 답변 (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 CenterFile Exchange에서 Mathematics에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by