#arrays #matlab
#массивы #matlab
Вопрос:
Следующий код генерирует индекс массива ячеек [1×29], где каждая ячейка представляет собой массив [29×6]:
for i = 1 : size(P1_cell,1)
for j = 1 : size(P1_cell,2)
[Lia,Lib] = ismember(P1_cell{i,j},PATTERNS_FOR_ERANOS_cell{1},'rows');
Index1(i,j) = Lib % 29x6
end
Index{i} = Index1; % 1x29
end
Как я могу найти ненулевые значения в массиве индексов?, т.е. Сгенерировать массив с количеством ненулевых значений в каждой строке массива Index1. Я попробовал следующий цикл, но он не работает, он создает конфликт с предыдущим:
for i = 1 : length(Index)
for j = 1 : length(Index)
Non_ceros = length(find(Index{:,i}(j,:))); %% I just need the length of the find function output
end
end
Мне нужна помощь, заранее спасибо.
Ответ №1:
Функция nnz()
(количество ненулей) может использоваться для оценки количества ненулевых элементов. Чтобы получить конкретные положительные значения, вы можете проиндексировать массив, используя индексы, возвращаемые find()
функцией. Я использовал некоторые случайные тестовые данные, но они также должны работать для массивов размером 29 на 6.
%Random test data%
Index{1} = [5 2 3 0 zeros(1,25)];
Index{2} = [9 2 3 1 zeros(1,25)];
Index{3} = [5 5 5 5 zeros(1,25)];
%Initializing and array to count the number of zeroes%
Non_Zero_Counts = zeros(length(Index),1);
for Row_Index = 1: length(Index)
%Evaluating the number of positive values%
Array = Index{Row_Index};
Non_Zero_Counts(Row_Index) = nnz(Array);
%Retrieving the positive values%
Positive_Indices = find(Array);
PositiveElements{Row_Index} = Array(Positive_Indices);
disp(Non_Zero_Counts(Row_Index) " Non-Zero Elements ");
disp(PositiveElements{Row_Index});
end
Запускался с использованием MATLAB R2019b
Комментарии:
1. Привет, спасибо за ответ. Моя проблема заключается не в поиске всех значений в массиве, а по строкам независимо и сохранении этих значений в массиве. Массив ячеек Index (1×29) содержит массивы Index1 (29×6), где я хочу по строкам (29) найти количество значений, которые не являются нулями. Это то, что nnz возвращает все значения, которые не равны нулю во всем массиве. Спасибо за ваше время.
2. Чтобы уточнить, вы хотите найти количество ненулевых элементов в каждой строке подмассивов? Где подмассивы — это массивы размером 29 на 6, хранящиеся в каждой ячейке массива размером 1 на 29 ячеек.
3. Если это так, нам может потребоваться более подробное объяснение того, как вы хотите, чтобы ваши выходные данные / результирующий массив были отформатированы.
4. Спасибо за ваш реплей. Я хочу, чтобы это можно было решить с помощью кода, который я добавил с помощью nnz(). Произошло то, что у меня была ошибка в другой части моего кода. Спасибо
Ответ №2:
for i = 1 : length(Index)
for j = 1 : length(Index)
Non_ceros(i,j) = nnz(Index{:,i}(j,:));
end
end