记录二维数组的一些不懂的且要注意的地方

博客围绕数组指针展开,提到数组指针(行指针)定义为 int (*p)[n],在打印二维数组时遇到输出问题,希望大神解答。还介绍了另一种基于数组指针打印二维数组的方法,同时指出数组形参 int a[] 等价于 int*a,函数内 sizeof(a) 是指针大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组指针(也称行指针)定义 int (*p)[n];

float w[3][2]= {1.6,2.7,3.5,7.1,81.1,9.1};
    float (*tt)[2]=w;
    for(int i=0; i<3; ++i)
    {
        for(int j=0; j<2; j++)
        {
            cout<<*tt[j]<<"****";
        }
        ++tt;
   }

本来按道理应该是逐行输出为1.6,2.7,3.5,7.1,81.1,9.1才对(忘了在++t后加换行了),然而输出的是这里写图片描述
若有大神看到本备忘录请解答一下。


So,用了另一种方法,在数组指针的基础上,打印二维数组
参考了https://blog.youkuaiyun.com/u013752202/article/details/49688717

void sz(void **tab,int rows,int cols)//二维数组的长和宽可以随意,而且同一个函数可以接收不同类型的数组
{
    for(int i=0; i<rows; i++)
    {
        for(int j=0; j<cols; j++)
        {
            cout<<*((float*)tab+i*cols+j)<<" ";
        }
        cout<<endl;
    }
}

    float w[2][3]= {1.6,2.7,3.5,7.1,81.1,9.1};
    float (*tt)[3]=w;
    sz((void**)tt,2,3);//或者 sz((void**)w,2,3)但不能直接sz(w,2,3);?   

数组形参int a[]等价int*a;在函数内一样是代表指针,因此在函数内用sizeof(a)的时候这是指针大小而不是数组大小
void test(int a[])//等同于int*a

### 三维张量的可视化方法 为了更好地理解和展示通过 `torch.stack()` 生成的多维张量(如 `output1` 和 `output2`),可以采用多种三维可视化工具和技术。这些技术能够帮助用户更直观地观察数据的空间分布和结构特征。 --- #### 数据准备与转换 假设已经生成了如下张量: ```python import torch import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D a = torch.rand(1, 2) b = torch.rand(1, 2) c = torch.rand(1, 2) output1 = torch.stack([a, b, c], dim=0).numpy() # Shape: (3, 1, 2) output2 = torch.stack([a, b, c], dim=1).numpy() # Shape: (1, 3, 2) ``` 由于 Matplotlib 和其他常见库更适合处理 NumPy 数组,因此先将 PyTorch 张量转换为 NumPy 数组[^1]。 --- #### 方法一:使用 Matplotlib 进行三维绘图 Matplotlib 提供了强大的三维绘图功能,可以通过颜色编码来表示不同维度的数据值。 ##### 示例代码 以下代码展示了如何绘制 `output1` 的三维图像: ```python fig = plt.figure(figsize=(8, 6)) ax = fig.add_subplot(111, projection='3d') # 获取坐标网格 x, y = np.meshgrid(np.arange(output1.shape[-1]), np.arange(output1.shape[1])) z = np.zeros_like(x) # 将每个平面展开并赋予高度 for i in range(output1.shape[0]): # 遍历堆叠的第一个维度 ax.bar3d(x.ravel(), y.ravel(), z.ravel() + i, dx=0.5, dy=0.5, dz=output1[i].ravel(), shade=True, alpha=0.7, color=plt.cm.viridis(i / output1.shape[0])) ax.set_title('3D Visualization of Output1') ax.set_xlabel('Dimension 2') ax.set_ylabel('Dimension 1') ax.set_zlabel('Stack Dimension & Values') plt.show() ``` **解释**: - 使用 `bar3d` 函数创建柱状图,其中每根柱子的高度对应于张量中的数值。 - 不同的颜色代表不同的堆叠层,便于区分各个部分[^2]。 --- #### 方法二:利用 Plotly 实现交互式可视化 Plotly 是一种支持交互式的可视化工具,适合探索复杂的高维数据集。 ##### 示例代码 以下是基于 Plotly 的实现方式: ```python import plotly.graph_objects as go # Flatten and reshape data for plotting x, y = np.meshgrid(range(output1.shape[-1]), range(output1.shape[1])) data = [] for i in range(output1.shape[0]): surf = go.Surface( x=x, y=y, z=i * np.ones_like(x), surfacecolor=output1[i], colorscale='Viridis', showscale=False ) data.append(surf) layout = go.Layout(title="Interactive 3D Visualization", scene=dict( xaxis_title="Dimension 2", yaxis_title="Dimension 1", zaxis_title="Stack Dimension" )) fig = go.Figure(data=data, layout=layout) fig.show() ``` **解释**: - 每一层堆叠被渲染成一个表面 (`Surface`),并通过颜色映射显示具体数值。 - 用户可通过鼠标拖动旋转视角,深入探究数据细节[^3]。 --- #### 方法三:借助 TensorBoard 查看张量变化过程 TensorBoard 是 TensorFlow 生态下的强大工具,同样适用于 PyTorch 工作流。它可以记录训练过程中张量的变化情况,并提供丰富的图表形式。 ##### 示例代码 保存日志文件以便后续查看: ```python from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter(log_dir="./logs") # 添加张量至 TensorBoard writer.add_histogram("Output1 Histogram", output1.flatten()) writer.close() # 启动 TensorBoard !tensorboard --logdir=./logs ``` 访问本地服务器地址即可浏览结果。此法特别适配动态场景下监控模型内部状态的需求[^4]。 --- ### 总结 以上三种方案各有侧重——静态离线分析可选 Matplotlib;在线互动体验推荐 Plotly;长期跟踪调试则倾向 TensorBoard。根据实际应用场景灵活选用合适的手段能极大提升工作效率与研究质量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值