#if (TIB_CONTROL == TRUE) for (gear = GEAR_R; gear < DRIVE_GEAR_MAX; gear++) { EdtrIn.ChassinfGearRatioArray[gear] = GetGearRatioTable(gear, GetDominantAxle()); } #else /*TIB_CONTROL == TRUE*/ #if(AUTOSAR_PROJECT_EDTR_INPUT != FALSE) (void)Rte_Read_R_ChassinfGearRatio_ChassinfGearRatioArray(gear_ratio); /* PRQA S 3417,3426 */ /* QAC DEVIATION: 2303365, 2303279 */ EdtrIn.ChassinfGearRatioArray = gear_ratio; #else /*AUTOSAR_PROJECT_EDTR_INPUT != FALSE*/ for (gear = GEAR_R; gear < DRIVE_GEAR_MAX; gear++) { EdtrIn.ChassinfGearRatioArray[gear] = GetChassinfGearRatio(gear, GetDominantAxle()); }
时间: 2024-04-06 07:31:17 浏览: 10
这是一段 C 语言的代码,其中包含了条件编译和循环语句。如果 TIB_CONTROL 宏定义为 TRUE,那么程序会进入循环语句,对数组 EdtrIn.ChassinfGearRatioArray 中的元素进行赋值操作。如果 TIB_CONTROL 宏定义为 FALSE,那么程序会根据 AUTOSAR_PROJECT_EDTR_INPUT 宏的定义情况,使用不同的方式读取数据并对数组进行赋值操作。
相关问题
运行这段代码。报错’ Unable to allocate 28.9 TiB for an array with shape (1866, 4259567003) and data type float32‘,如何解决:“smiles = data['SMILES'] fps = [] for smi in smiles: mol = Chem.MolFromSmiles(smi) fp = AllChem.GetMorganFingerprint(mol, 2) fps.append(fp.GetNonzeroElements()) fps_array = np.zeros((len(fps), max(max(fp.keys()) for fp in fps) + 1), dtype=np.float32) for i, fp in enumerate(fps): for key, value in fp.items(): fps_array[i][key] = value fps_df = pd.DataFrame(fps_array, columns=[f'Fingerprint_{i+1}' for i in range(fps_array.shape[1])])”
这个错误提示表明您尝试分配的内存空间超过了系统的可用内存限制。根据您提供的代码,生成的指纹矩阵大小为 (1866, 4259567003),这是一个非常大的矩阵,所以导致了内存不足的问题。
为了解决这个问题,您可以考虑以下几种方法:
1. 减小指纹矩阵的大小:您可以尝试减小分子指纹的维度或减少分子样本的数量,以减小生成的指纹矩阵的大小。
2. 使用稀疏矩阵表示:考虑到分子指纹通常是稀疏的,您可以使用稀疏矩阵来表示指纹矩阵,以节省内存空间。您可以使用SciPy库中的`scipy.sparse`模块来实现稀疏矩阵。
3. 分批处理:如果内存限制无法容纳整个指纹矩阵,您可以考虑将数据分批处理,逐批生成和处理分子指纹。
以下是一个示例代码,演示如何使用稀疏矩阵来表示分子指纹:
```python
from scipy.sparse import csr_matrix
smiles = data['SMILES']
fps = []
max_key = 0
for smi in smiles:
mol = Chem.MolFromSmiles(smi)
fp = AllChem.GetMorganFingerprint(mol, 2)
fps.append(fp.GetNonzeroElements())
max_key = max(max_key, max(fp.keys()))
fps_array = csr_matrix((len(fps), max_key + 1), dtype=np.float32)
for i, fp in enumerate(fps):
for key, value in fp.items():
fps_array[i, key] = value
fps_df = pd.DataFrame(fps_array.toarray(), columns=[f'Fingerprint_{i+1}' for i in range(fps_array.shape[1])])
```
在这个示例中,我使用了`scipy.sparse.csr_matrix`来创建稀疏矩阵,并在每个非零元素的位置上设置对应的值。
请注意,这些解决方案中的每一种都有其适用的场景和限制。您需要根据具体的需求和资源限制选择合适的方法。
numpy.core._exceptions._ArrayMemoryError: Unable to allocate 37.9 TiB for an array with shape (1011173, 5150761) and data type float64
这个错误提示表示你的计算机无法分配足够的内存来创建一个形状为 `(1011173, 5150761)`,数据类型为 `float64` 的数组。这个数组大约需要 37.9 TiB 的内存,这已经超出了绝大部分计算机的内存容量。
如果你的数据集确实非常大,可能需要考虑使用分布式计算框架(如 Apache Spark)或者使用基于 GPU 的计算。另外,还可以考虑使用稀疏矩阵来存储用户-物品评分矩阵,这样可以大大减少内存占用。
例如,可以使用 `scipy.sparse` 库中的 `coo_matrix` 类来创建稀疏矩阵:
```python
import numpy as np
from scipy.sparse import coo_matrix
# Load data from CSV file.
data = np.loadtxt('my.csv', delimiter=',')
user_ids = data[:, 0].astype(int) - 1
item_ids = data[:, 1].astype(int) - 1
ratings = data[:, 2]
# Create sparse user-item rating matrix.
R = coo_matrix((ratings, (user_ids, item_ids)))
# Train model using ALS algorithm.
K = 10
max_iter = 10
lambda_ = 0.1
U, V = als(R, K, max_iter, lambda_)
# Predict ratings for test set.
R_pred = U.dot(V.T)[R.nonzero()]
# Compute RMSE.
mse = np.mean((R_pred - ratings[R.nonzero()]) ** 2)
rmse = np.sqrt(mse)
print('RMSE:', rmse)
```
上面的代码使用 `coo_matrix` 类创建稀疏矩阵 `R`,然后将其作为参数传递给 `als` 函数进行训练。在计算 RMSE 时,我们只需要使用非零元素的位置来选择预测评分和实际评分,这样可以大大减少内存占用。