Is it possible to reduce this for loop into one line of code?
조회 수: 6 (최근 30일)
이전 댓글 표시
My goal is to simplify the for-loop below to a one line of code. Please see attached for a mat file storing the Headers variable. Many thanks for any recommendations
% Find missing values in the Headers cell array:
Ind1 = cellfun(@(X)any(ismissing(X),'all'), Headers);
for i=1:numel(Ind1)
if Ind1(i)
Headers{i} = ['Missing_header_', num2str(i)];
end
end
댓글 수: 0
채택된 답변
Voss
2025년 3월 12일
Ind1 = cellfun(@(X)any(ismissing(X),'all'), Headers);
Headers(Ind1) = cellstr("Missing_header_"+find(Ind1));
추가 답변 (3개)
Walter Roberson
2025년 3월 12일
Headers(cellfun(@(X)any(ismissing(X),'all'), Headers)) = cellstr("Missing_header_" + find(cellfun(@(X)any(ismissing(X),'all'), Headers)));
Just because you can do it on one line doesn't mean that you should do it on one line. I would recommend at least two lines
mask = cellfun(@(X)any(ismissing(X),'all'), Headers);
Headers(mask) = cellstr("Missing_header_" + find(mask));
dpb
2025년 3월 12일
편집: dpb
2025년 3월 12일
load test11
whos
Headers
There aren't any missing in Headers so we'll make up some...
H=Headers;
H(3)={''}; H(5)=H(3)
H(ismissing(H))=compose('Missing_header_%d',find(ismissing(H)))
is one line of code albeit in order to do that one has to call ismissing twice't instead of using a temporary as did @Walter Roberson with whom I don't disagree that sometime just because can isn't necessarily any better than straightforward. Although I'd not use a loop here, I would probably choose the temporary since to satisfy the request the find is needed to get the positions...
ix=find(ismissing(H));
H(ix)=compose('Missing_header_%d',ix)
using compose to build an array of cellstrings instead of the new(ish) string class wherein numbers are silently converted to string representation and the plus operator is overloaded to concatenate strings that @Voss used.
참고 항목
카테고리
Help Center 및 File Exchange에서 Whos에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!