从您提供的输出数据来看,`modified_data` 是一个包含复数(complex numbers)的二维数组(形状可能是 `(N, 2)`),其中大部分元素已被成功置零(`0. + 0.j`),但仍保留了一些非零的复数元素(如 `0.70710678+0.70710678j` 和 `-0.70710678-0.70710678j`)。
### **问题分析**
1. **数据格式**:
- 数据是复数(`a + bj`),其中 `a` 是实部,`b` 是虚部。
- 非零值看起来像是归一化的 QPSK 或 16QAM 符号(如 `±0.7071 ± 0.7071j` 是 QPSK 的标准值)。
2. **置零逻辑**:
- 您的代码似乎只对某些特定位置(如 `group_rs[:, 2, idx, :]`)进行了置零操作,但其他位置可能仍然保留原始数据。
- 如果目标是 **完全稀疏化**(即所有非指定位置都置零),可能需要调整置零范围。
3. **重复输出**:
- 您提供的 `modified_data` 似乎重复了两次,可能是打印时的冗余。
---
### **改进建议**
#### **1. 确保所有目标位置被正确置零**
如果您的目标是 **仅保留特定位置的符号**(如每 12 个符号中的某些位置),其余置零,可以优化置零逻辑:
```python
# 示例:对 group_rs 的特定维度置零
for idx in range(data.shape[2]): # 遍历第3维度(长度120)
group_idx = idx // 12 # 计算当前属于哪一组(0-9)
pos_in_group = idx % 12 # 计算组内位置(0-11)
# 判断是否要置零(根据您的规则)
if group_idx in {2, 7}: # 特殊组
if pos_in_group not in {0, 2, 4, 6, 8, 10}: # 保留这些位置
data[:, 2, idx, :] = 0 # 其余置零
else: # 普通组
if pos_in_group not in {2, 4, 8, 10}: # 保留这些位置
data[:, 2, idx, :] = 0 # 其余置零
```
#### **2. 优化打印输出**
避免打印整个数组,改为统计非零元素:
```python
def print_sparsity_stats(data, var_name):
total_elements = data.size
nonzero_elements = np.count_nonzero(data)
sparsity = 100 * (1 - nonzero_elements / total_elements)
print(f"{var_name} 稀疏化统计: 总元素={total_elements}, 非零元素={nonzero_elements}, 稀疏度={sparsity:.2f}%")
```
#### **3. 完整改进代码**
```python
import os
import scipy.io
import numpy as np
def process_and_save_sparse_5PRB(source_folder, target_folder, filename_pattern, var_name):
os.makedirs(target_folder, exist_ok=True)
# 定义保留位置规则(组内索引)
keep_positions = {
2: {0, 2, 4, 6, 8, 10}, # 第2组保留的位置
7: {0, 2, 4, 6, 8, 10}, # 第7组保留的位置
}
default_keep = {2, 4, 8, 10} # 其他组保留的位置
for i in range(1, 6):
source_file = os.path.join(source_folder, filename_pattern.format(i))
target_file = os.path.join(target_folder, filename_pattern.format(i))
# 读取数据
mat_data = scipy.io.loadmat(source_file)
data = mat_data[var_name].copy()
# 遍历目标维度(假设是第3维度,索引2)
for idx in range(data.shape[2]):
group_idx = idx // 12
pos_in_group = idx % 12
# 判断是否要置零
if group_idx in keep_positions:
if pos_in_group not in keep_positions[group_idx]:
data[:, 2, idx, :] = 0 # 置零
else:
if pos_in_group not in default_keep:
data[:, 2, idx, :] = 0 # 置零
# 保存并打印统计
scipy.io.savemat(target_file, {var_name: data})
print_sparsity_stats(data[:, 2, :, :], f"{filename_pattern.format(i)}/{var_name}")
def print_sparsity_stats(data, label):
total = data.size
nonzero = np.count_nonzero(data)
sparsity = 100 * (1 - nonzero / total)
print(f"{label}: 稀疏度={sparsity:.2f}% (非零元素={nonzero}/{total})")
# 示例调用
process_and_save_sparse_5PRB(
source_folder="/home/data/low_overhead_dmrs/SUMIMO_simulation_data/16QAM/Old_SUMIMO2T4R_CDLC_add0_MCS10_SNR_11p6/TxDMRS",
target_folder="/home/data/low_overhead_dmrs/SUMIMO_simulation_data/16QAM/Old_SUMIMO2T4R_CDLC_add0_MCS10_SNR_11p6_Sparse_5PRB/TxDMRS",
filename_pattern="Training_Rs_{}.mat",
var_name="group_rs"
)
```
---
### **关键改进点**
1. **更清晰的置零规则**:
- 使用字典 `keep_positions` 明确每组保留的位置。
- 默认保留 `{2, 4, 8, 10}`,特殊组(如第2、7组)保留更多位置。
2. **稀疏度统计**:
- 打印非零元素比例,验证稀疏化效果。
3. **避免冗余打印**:
- 不再打印整个数组,而是输出关键统计信息。
---
### **下一步建议**
1. **验证数据正确性**:
- 检查置零后的数据是否符合预期(如非零符号是否仅出现在指定位置)。
2. **扩展到其他变量**:
- 对 `group_freqdata`、`group_lsresult` 等变量应用相同逻辑。
3. **性能优化**:
- 如果数据量很大,可以用 `numba` 加速循环。
如果需要进一步调整(如修改保留位置规则),请提供更详细的需求!