Вы можете использовать комбинацию sparse
и full
, где можно указать строки и столбца местоположения ненулевые, а остальные матрицы будет равен нулю:
A = [7 1; 3 2; 4 3];
B = full(sparse(A(:,1), A(:,2), 1, max(A(:,1)), max(A(:,2)))) == 1;
Команда sparse
занимает в строке и расположение столбцов того, что отличное от нуля для первых двух входов, третий вход - это то, что ненулевое местоположение будет для каждой строки и столбца. Мы можем указать константу для обозначения того, что каждое ненулевое местоположение получает тот же коэффициент, который равен 1. Мы также можем указать размер матрицы, где в этом случае строки и столбцы вывода соответствуют наибольшему числу в первый и второй столбцы соответственно. Поскольку это матрица sparse
, вам необходимо преобразовать ее в матрицу full
, и поскольку вы хотите, чтобы она была логической, вам нужно будет сравнить все элементы с номером 1.
Таким образом, мы получаем для вывода, который является B
:
B =
7×3 logical array
0 0 0
0 0 0
0 1 0
0 0 1
0 0 0
0 0 0
1 0 0
в качестве альтернативы можно использовать sub2ind
для создания линейных индексов для индекса в предварительно выделенной матрицу logical
ложных и установить только те ненулевые места строки в true
:
A = [7 1; 3 2; 4 3];
B = false(max(A(:,1)), max(A(:,2)));
ind = sub2ind(size(B), A(:,1), A(:,2));
B(ind) = true;
Сначала мы выделим матрицу, а затем вычислим линейные индексы для индексации в матрицу, а затем, наконец, установим правильные местоположения на true
. Результат здесь будет таким же, как и для подхода sparse
.
Ницца! Я также нашел, что 'accumarray (A, 1)' дает тот же результат. – dexterdev
@dexterdev На самом деле это очень приятное решение.Извините, я не думал об этом. – rayryeng
, честно говоря, я случайно наткнулся на эту команду на странице справки matlab. – dexterdev