Matlab报错:不支持对cell类型操作数执行.*运算
Matlab报错「Operation .* not supported for operands of type cell」解决方案
问题背景
运行以下Matlab代码时触发报错:Operation .* not supported for operands of type cell,报错出现在dataidx = find( [data(:,1).*pps] < Npix )这一行。
nVelCurve = length( velnum ); % number of assigned velocity curves pixLocVC = vel_imloc(:,1)'; % column index for each assigned velocity curve nVelPts = nan( 1,nVelCurve ); % number of points used from each chosen vel curve pix = []; % row index for TWTT from velmodels, stacked vels = []; % velocity for each TWTT from velmodels, stacked for i=1:nVelCurve data = sprintf( 'Fit%g', velnum(i) ); data = DataFits.(data); data(:,1) = data(:,1); dataidx = find( [data(:,1).*pps] < Npix ) ; %this line gives the problem data = data(dataidx,:); pix = [ pix; ceil(data(:,1).*pps) ]; nVelPts(i) = length(data); vels = [ vels; data(:,2) ]; end
已知条件:
data是存储十进制整数的n*2 cell数组DataFits是包含cell数组的结构体pps和Npix为十进制整数
报错原因
Matlab不支持直接对cell类型数组执行元素级乘法(.*)运算。报错行中data(:,1)是cell列向量,无法直接与数值pps进行.*运算。
解决方法
将cell数组转换为数值矩阵后再执行运算,核心是使用cell2mat函数完成类型转换(前提是cell内所有元素均为可转换的数值类型)。
修正后的完整代码
nVelCurve = length( velnum ); % 已分配速度曲线的数量 pixLocVC = vel_imloc(:,1)'; % 每条已分配速度曲线的列索引 nVelPts = nan( 1,nVelCurve ); % 每条选中速度曲线使用的点数 pix = []; % 来自速度模型的TWTT行索引,堆叠存储 vels = []; % 每个TWTT对应的速度,堆叠存储 for i=1:nVelCurve dataName = sprintf( 'Fit%g', velnum(i) ); data = cell2mat(DataFits.(dataName)); % 将cell数组转为数值矩阵 dataidx = find( data(:,1).*pps < Npix ) ; % 修正后可正常执行元素级乘法 data = data(dataidx,:); pix = [ pix; ceil(data(:,1).*pps) ]; nVelPts(i) = length(data); vels = [ vels; data(:,2) ]; end
补充说明
- 如果cell数组中存储的是字符串形式的数值(而非直接的数值类型),可以用
cellfun(@str2double, data(:,1))提取列中的数值,再参与运算:data_col1 = cellfun(@str2double, DataFits.(dataName)(:,1)); dataidx = find( data_col1.*pps < Npix ); cell2mat适用于cell内元素均为同维度数值的场景,转换效率更高。
内容的提问来源于stack exchange,提问作者UserX
相关产品推荐
相关产品推荐

