[已解决] 求平均矩阵的困难问题

[复制链接]
杨杨yaaaaaa 发表于 2022-11-22 10:37:31
A = [1 NaN;2 1],B = [NaN 1;1 2]
如何求得A,B两矩阵去除无效值后的平均矩阵?

最佳答案


TouAkira 发表于 2022-11-22 11:32:40
:L 4楼和5楼想多了吧,都有内置函数的, nanmean函数(超链接,自己点进去看) 或者 mean函数(超链接) 加参数选项。
M( :, :, 1 ) = A; M( :, :, 2 ) = B;
nanmean( M, 3 ) % 2006a 到 2020b版本
mean( M, 3, 'omitnan' ) % 2020版
结果都是
                         1                         1
                       1.5                       1.5

11 条回复


cbcbcbcb 发表于 2022-11-22 10:51:44
遇到校友了哈,回答一下校友!参考代码:
  1. A = [1 NaN;2 1];
  2. B = [NaN 1;1 2];
  3. A(isnan(A)) = 0;
  4. B(isnan(B)) = 0;
  5. Average_AB = (A + B)/2;
复制代码

杨杨yaaaaaa 发表于 2022-11-22 10:57:06
cbcbcbcb 发表于 2022-11-22 10:51
遇到校友了哈,回答一下校友!参考代码:

感谢校友,但是这个运行出来结果是[0.5 0.5;1.5 1.5], 我想运行出来的是[1 1;1.5 1.5],就是不算无效数值的个数,这样怎么实现呢?

cbcbcbcb 发表于 2022-11-22 11:13:47
杨杨yaaaaaa 发表于 2022-11-22 10:57
感谢校友,但是这个运行出来结果是[0.5 0.5;1.5 1.5], 我想运行出来的是[1 1;1.5 1.5],就是不算无效数 ...

麻烦校友给个最佳答案哈:
  1. A = [1 NaN;2 1];
  2. B = [NaN 1;1 2];
  3. a_index = isnan(A);
  4. b_index = isnan(B);
  5. c_index = a_index + b_index;

  6. A(isnan(A)) = 0;
  7. B(isnan(B)) = 0;
  8. res = (A + B)/2;

  9. res(logical(c_index)) = res(logical(c_index))*2
复制代码



开水窝瓜 发表于 2022-11-22 11:27:52
  1. A = [1 NaN;2 1];
  2. B = [NaN 1;1 2];
  3. for i=1:length(A(1,:))
  4.     for j=1:length(A(:,1))
  5.         if isnan(A(i,j))
  6.             C(i,j)=B(i,j);
  7.         elseif isnan(B(i,j))
  8.             C(i,j)=A(i,j);
  9.         else
  10.             C(i,j)=(A(i,j)+B(i,j))/2;
  11.         end
  12.     end
  13. end
复制代码

一个简单的遍历加判断,可以结合我和楼上的程序实现一个更优化的。

TouAkira 发表于 2022-11-22 11:32:40
:L 4楼和5楼想多了吧,都有内置函数的, nanmean函数(超链接,自己点进去看) 或者 mean函数(超链接) 加参数选项。
M( :, :, 1 ) = A; M( :, :, 2 ) = B;
nanmean( M, 3 ) % 2006a 到 2020b版本
mean( M, 3, 'omitnan' ) % 2020版
结果都是
                         1                         1
                       1.5                       1.5
回复此楼

开水窝瓜 发表于 2022-11-22 11:35:49
TouAkira 发表于 2022-11-22 11:32
4楼和5楼想多了吧,都有内置函数的, nanmean函数(超链接,自己点进去看) 或者 mean函数(超链接) 加 ...

学到了学到了:handshake:handshake

cbcbcbcb 发表于 2022-11-22 11:43:43
TouAkira 发表于 2022-11-22 11:32
4楼和5楼想多了吧,都有内置函数的, nanmean函数(超链接,自己点进去看) 或者 mean函数(超链接) 加 ...

厉害

TouAkira 发表于 2022-11-22 11:53:00

:L 其实当年我也费劲写了一堆判定,随后看到某位大佬(实在记不清是哪位了)回帖介绍有nan系列内置函数。
估计以后还会有其他不知道这些小窍门的热心坛友,接着重复我和你们写判定的操作,到时候就轮到你们向他们介绍了。

TouAkira 发表于 2022-11-22 11:53:19

:L 其实当年我也费劲写了一堆判定,随后看到某位大佬(实在记不清是哪位了)回帖介绍有nan系列内置函数。
估计以后还会有其他不知道这些小窍门的热心坛友,接着重复我和你们写判定的操作,到时候就轮到你们向他们介绍了。

1119093102 发表于 2022-11-23 19:39:30
本帖最后由 1119093102 于 2022-11-23 19:42 编辑
TouAkira 发表于 2022-11-22 11:53
其实当年我也费劲写了一堆判定,随后看到某位大佬(实在记不清是哪位了)回帖介绍有nan系列内置函数。 ...

mean里面有个omitnan选项,加上这个自动屏蔽nan,哈哈,认真看help的人果然还是有好处的,nanmean我也遇到过,那时候还想不明白怎么重复了,原来2014a没有omitnan选项。。。

TouAkira 发表于 2022-11-25 02:48:59
1119093102 发表于 2022-11-23 07:39
mean里面有个omitnan选项,加上这个自动屏蔽nan,哈哈,认真看help的人果然还是有好处的,nanmean我也遇到 ...

是的,MATLAB内置函数也随着版本更新有过许多调整,包括我在内的用得比较久的用户,也需要经常查阅帮助文档了解是否有新功能、旧语法是否仍受支持等等,这也是 深蓝孩童  等版主一直建议大家养成多查帮助文档习惯的原因。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表